2010-11-04 9 views
10

मैं कई दशकों में मासिक वर्षा का प्रतिनिधित्व रेखापुंज डेटासेट की एक बड़ी श्रृंखला है। मैं अजगर में एक स्क्रिप्ट है कि प्रत्येक रेखापुंज से अधिक लूप और करता है निम्नलिखित लिखा है:, एक नया जल स्तर की गणना करने केमेमोरी एरर प्राप्त किए बिना पाइथन में बड़े डेटासेट के माध्यम से मैं कैसे लूप करूं?

  1. एक numpy नकाबपोश सरणी के लिए रेखापुंज में बदलता है, सरणी बीजगणित के
  2. निष्पादित बहुत
  3. परिणाम आउटपुट रास्टर को परिणाम देता है।
  4. पुनर्प्रसारण

स्क्रिप्ट सिर्फ सरणी बीजगणित समीकरण एक पाश बयान से घिरा की एक लंबी सूची है।

अगर मैं अपने डेटा के एक छोटे से हिस्से (20 साल का मूल्य कहता हूं) पर स्क्रिप्ट चलाता हूं, तो सब ठीक काम करता है, लेकिन अगर मैं पूरी तरह से संसाधित करने की कोशिश करता हूं तो मुझे MemoryError मिलता है। त्रुटि उस से अधिक जानकारी नहीं देती है (सिवाय इसके कि उस कोड में रेखा को हाइलाइट करता है जिस पर पायथन छोड़ दिया जाता है)।

दुर्भाग्य से, मैं आसानी से मात्रा में अपने डेटा को संसाधित नहीं कर सकते हैं - मैं वास्तव में एक ही बार में बहुत ऐसा करने में सक्षम होने की जरूरत है। ऐसा इसलिए है क्योंकि, प्रत्येक पुनरावृत्ति के अंत में, आउटपुट (जल स्तर) को प्रारंभिक पुनरावृत्ति के रूप में अगले पुनरावृत्ति में वापस खिलाया जाता है।

प्रोग्रामिंग की मेरी समझ वर्तमान में बहुत ही बुनियादी है, लेकिन मैंने सोचा कि मेरी वस्तुओं की सभी बस प्रत्येक पाश पर ओवरराइट किया जाएगा। मैं (बेवकूफ?) ने माना कि यदि कोड एक बार सफलतापूर्वक लूप करने में कामयाब रहा तो यह अधिक से अधिक स्मृति का उपयोग किये बिना अनिश्चित काल तक लूप करने में सक्षम होना चाहिए।

मैंने प्रलेखन के विभिन्न टुकड़ों को पढ़ने की कोशिश की और कुछ "कचरा कलेक्टर" कहा जाता है की खोज की है, लेकिन मुझे लगता है कि मैं अपने गहराई और मेरे मस्तिष्क के पिघलने से बाहर हो रही है! क्या कोई मेरे मूल loops जब स्मृति में वस्तुओं के वास्तव में क्या होता है में कुछ बुनियादी अंतर्दृष्टि प्रदान कर सकते हैं? क्या प्रत्येक लूप के अंत में फ्री-अप मेमोरी का कोई तरीका है, या क्या कोडिंग का कुछ और "पायथनिक" तरीका है जो इस समस्या को पूरी तरह से टालता है?

+1

मुझे नहीं लगता कि लोग कुछ स्रोत कोड देखे बिना आपकी बहुत मदद कर सकेंगे। – GWW

उत्तर

4

एक त्वरित तरीका है "शक्ति" कचरा कलेक्टर को साफ करने के लिए अस्थायी पाश-केवल वस्तुओं डेल कथन है:

for obj in list_of_obj: 
    data = obj.getData() 
    do_stuff(data) 
    del data 

इसे हटाना दुभाषिया और अस्थायी वस्तुओं बाध्य करती है। नोट: यह सुनिश्चित नहीं करता है कि प्रोग्राम गणना के अन्य हिस्सों में स्मृति को रिसाव या उपभोग नहीं करता है, यह केवल एक त्वरित जांच

5

आपको स्मृति प्रबंधन के साथ खुद को चिंता करने की आवश्यकता नहीं है, खासतौर पर कचरा कलेक्टर के साथ नहीं एक बहुत ही विशिष्ट कार्य है जिसका आप सबसे अधिक उपयोग नहीं करते हैं। पाइथन हमेशा उस स्मृति को एकत्र करेगा जो इसे कर सकता है और इसका पुन: उपयोग कर सकता है।

वहाँ आपकी समस्या के लिए सिर्फ दो कारण हैं: या तो डेटा आप लोड करने का प्रयास अपनी गणना की दुकान कहीं डेटा (एक सूची, dict, कुछ पुनरावृत्तियों के बीच लगातार) और कहा कि भंडारण बढ़ता है और बढ़ता है स्मृति में फिट या करने के लिए बहुत ज्यादा है । Memory profilers can help यह खोज रहा है।

संबंधित मुद्दे