2013-04-28 7 views
34

अद्यतन में बड़ी संख्यात्मक सरणी की स्मृति जारी करना अद्यतन: - यह समस्या मशीन रीबूट के बाद स्वयं हल हो गई। अभी तक यह पता लगाने में सक्षम नहीं है कि यह त्रुटि पहले क्यों हो रही थी।आईपीथॉन

मेरे पास एक ऐसा फ़ंक्शन है जो एक विशाल numpy सरणी (~ 980MB) लोड करता है और इसे वापस करता है।

जब मैं पहली बार आईपीथॉन शुरू करता हूं और इस फ़ंक्शन को कॉल करता हूं, तो यह किसी भी समस्या के बिना सरणी को सरणी में लोड करता है।

लेकिन यदि मैं एक ही आदेश फिर से चलाता हूं, तो यह "मेमोरी त्रुटि" को बढ़ाता है।

मैं निम्नलिखित की कोशिश की,

del hugeArray 

अब भी वही त्रुटि होने वाली किया गया था। मैं भी निम्नलिखित

del hugeArray 
gc.collect() 
gc.collect() 

शुरू करने की कोशिश की, gc.collect() 145 लौट आए और दूसरी कॉल 48. लौटे लेकिन इस के बाद भी जब मैं फ़ंक्शन को कॉल करें, यह अभी भी एक मेमोरी त्रुटि को ऊपर उठाने की गई थी।

एकमात्र तरीका जिसे मैं फिर से लोड कर सकता था ipython को पुनरारंभ करना था। क्या आईपीथॉन में सभी मेमोरी को मुक्त करने के लिए मैं कुछ कर सकता हूं, ताकि मुझे इसे पुनरारंभ करने की आवश्यकता न हो?

---------------- अद्यतन

बाद %whos

Variable Type  Data/Info 
------------------------------ 
gc   module <module 'gc' (built-in)> 
gr   module <module 'Generate4mRamp' <...>rom 'Generate4mRamp.pyc'> 
np   module <module 'numpy' from '/us<...>ages/numpy/__init__.pyc'> 
plt  module <module 'matplotlib.pyplo<...>s/matplotlib/pyplot.pyc'> 

इसमें से के उत्पादन में है, जीआर मेरी समारोह युक्त मॉड्यूल है जो मैं डेटा घन लोड करने के लिए प्रयोग किया जाता था।

--------- त्रुटि

निम्नलिखित सरल समारोह त्रुटि पुन: पेश करने में सक्षम है पुन कैसे।

import numpy as np 
import gc 

def functionH(): 
    cube=np.zeros((200,1024,1024)) 
    return cube 

testcube=functionH() #Runs without any issue 

del testcube 
testcube=functionH() # Raises Memory Error 

del testcube 
gc.collect() 
gc.collect() 
testcube=functionH() # Still Raises Memory Error 

यह त्रुटि केवल Ipython में होती है। del testcube देने के बाद सरल पायथन (>>>) में, कोई मेमोरी त्रुटि नहीं है।

+1

क्या आप मेमोरी ले रहा है यह जानने के लिए ipython में 'whos' को कॉल करने का प्रयास कर सकते हैं? – tiago

+0

@tiago: मैंने% whos कमांड का आउटपुट जोड़ा है। यह लोड किए गए मॉड्यूल के अलावा कोई भी चीज़ नहीं दिखाता है। – indiajoe

+0

क्या आप इसे हटाने से पहले ऑब्जेक्ट की संदर्भ संख्या दिखा सकते हैं? 'आयात sys; sys.getrefcount (testcube)' – HYRY

उत्तर

43

क्या आप मूल्य देख रहे हैं? IPython कैश आउटपुट वैरिएबल उदा। Out[8], इसलिए यदि आप इसकी जांच करते हैं, तो इसे स्मृति में रखा जाएगा।

आप चर को हटाने और इसे IPython के कैश से हटाने के लिए %xdel testcube कर सकते हैं। वैकल्पिक रूप से, %reset out या %reset array या तो आपके सभी आउटपुट इतिहास, या केवल numpy arrays के संदर्भों को साफ़ कर देगा।

+0

मैं आईपीथन में मूल्य नहीं देख रहा था। लेकिन Ipython आउटपुट कैशिंग के बारे में इस जानकारी के लिए धन्यवाद। मुझे इसके बारे में पता नहीं था। अगली बार यह त्रुटि तब होती है जब मैं यह xdel कमांड भी आज़माउंगा। अभी, सब कुछ ठीक काम कर रहा है। – indiajoe

+2

क्या इसका कोई कारण ठीक से काम नहीं करने का कोई कारण है? मैं इस सूची का परीक्षण करने के लिए 'सूची ([i ** 2 i in range (30000000)]) की कोशिश करने की कोशिश करता हूं, और फिर मैं% रीसेट करने का प्रयास करता हूं। आउट उसके बाद खाली है, लेकिन स्मृति अभी भी रीसेट कमांड के पहले कब्जा कर लिया गया है, वह क्यों हो सकता है? ऐसा लगता है कि यह केवल संदर्भ को हटा रहा है। लेकिन स्मृति जारी नहीं है? – Marko

+0

मुझे उस% रीसेट को जोड़ना चाहिए, बिना काम के 'आउट'। यह दोनों स्मृति को खाली करता है और संदर्भों को हटा देता है। लेकिन मैं अपने स्वयं के चर ढीला नहीं करना चाहता। इसके अलावा, यह 'v = आउट [18]% xdel v' काम करता है। ऐसा क्यों है? – Marko