60

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

巨大な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では、メモリエラーはありません。

4

1 に答える 1

61

値を見ていますか?IPython は出力変数を eg としてキャッシュOut[8]するので、調べるとメモリに保持されます。

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

于 2013-04-29T11:55:50.187 に答える