2013-04-28 30 views
34

更新: - この問題は、マシンの再起動後に解決されます。このエラーがなぜ起きたのかまだ分かりません。IPythonで膨大な数の配列のメモリを解放する

私は膨大な数の配列(〜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でのみ発生します。 del testcubeを与えた後の単純なPython(>>>)では、メモリエラーはありません。

+1

ipythonで 'whos'を呼び出して、何がメモリを占有しているか調べることができますか? – tiago

+0

@tiago:%whosコマンドの出力を追加しました。ロードしたモジュール以外は表示されません。 – indiajoe

+0

オブジェクトを削除する前に参照カウントを表示できますか? 'import sys; sys.getrefcount(testcube)' – HYRY

答えて

43

あなたは値を見ていますか? IPythonは、例えば次のような出力変数をキャッシュします。 Out[8]ですので、調べるとメモリに保存されます。

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

+0

私はIPythonの値を見ていませんでした。しかし、Ipythonが出力をキャッシュすることに関するこの情報に感謝します。私はこれについて知らなかった。次回このエラーが発生したときにもこのxdelコマンドを試してみます。今、すべてうまくいっています。 – indiajoe

+2

これが正しく動作しない理由はありますか?これをテストするために 'list([i ** 2 for i in range(30000000)])'のようなことをしてから、%resetを実行しようとします。それ以降はOutが空ですが、リセットコマンドの前にメモリがまだ占有されていますが、なぜそれが可能でしょうか?参照を削除するだけですメモリを解放しませんか? – Marko

+0

%resetを追加して、 'out'を使わないで作業します。両方ともメモリを空にして参照を削除します。しかし私は自分自身の変数を失いたくはありません。また、これは 'v = Out [18]%xdel v'でも動作します。何故ですか? – Marko

関連する問題