web-dev-qa-db-ja.com

IPythonで巨大なnumpy配列のメモリを解放する

UPDATE:-この問題は、マシンの再起動後に解決しました。このエラーが以前に発生した理由をまだ理解できていません。

巨大なnumpy配列(〜980MB)をロードして返す関数があります。

Ipythonを初めて起動してこの関数を呼び出すと、問題なく配列が変数に読み込まれます。

ただし、同じコマンドを再度実行すると、「メモリエラー」が発生して終了します。

私は次を試しました、

_del hugeArray
_

それでも同じエラーが発生していました。私も次のことを試しました

_del hugeArray
gc.collect()
gc.collect()
_

最初、gc.collect()は145を返し、2番目の呼び出しは48を返しました。しかし、この関数を呼び出した後でも、メモリエラーが発生していました。

再度ロードできる唯一の方法は、ipythonを再起動することでした。 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'>
_

このうち、grは、データキューブの読み込みに使用した関数を含む私のモジュールです。

---------エラーの再現方法

次の単純な関数は、エラーを再現できます。

_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でのみ発生します。単純なpython(>>>)では_del testcube_を指定した後、メモリエラーはありません。

49
indiajoe

値を見ていますか? IPythonは、出力変数をたとえばOut[8]ですので、調べればメモリに保存されます。

できるよ %xdel testcube変数を削除し、IPythonのキャッシュから削除します。または、%reset outまたは%reset arrayは、出力履歴をすべてクリアするか、numpy配列への参照のみをクリアします。

55
Thomas K