多くのパッケージを使用するPythonアプリケーションがあります。実行中にいくつかのメモリリークが発生します。これは、すべての変数をコピーして削除しても累積されます。いくつかのステートメントに達した場合、Python再起動プログラム
最終的にプログラムがクラッシュします。だから私は解決策は、メモリが問題になったときにプログラムを再起動することができると思う。すべてのゴミを排除するために、新しいセッションを開始した後に古いプログラムを強制終了してメモリを解放する必要があります。
基本的なコードは次のようになります。それはIpythonである場合
results = load('results')
data = load('data')
results += some_stupid_operation(results,data)
save('results', results)
restart_program() # Kill current program and start new instance
それは大丈夫です。
免責事項:私はこれが一般にメモリリークの解決策ではないことを認識しています。関数を関数に置くことで問題は解決するはずです。ガベージコレクタはdabadabaがコメントしたようにそれ自体を修正する必要があります。
解決策は、ロッシミラノボブによって与えられます。コード例:
#!/usr/bin/env python
# program testing the solution
import numpy as np
import os
import sys
if len(sys.argv)==1:
sys.argv=[sys.argv[0],'1']
else:
sys.argv[1]=str(int(sys.argv[1])+1) # increment iteration
print sys.argv
a=np.zeros(10**6) # approximate 10 MB
# Memory does not accumulate over iterations
# Looking at system monitor
if int(sys.argv[1])<100:
os.execv(sys.executable, ['python'] + sys.argv)
の上に次のコードを追加することにより、スクリプトを実行可能に作られていることを確認しますがロジックを関数に入れ、その関数を終了すると、メモリを解放するのに十分なはずです。 – dabadaba
解決策はほとんどの場合、「すべての変数をコピーして削除する」ことではありません。 –
私はダバダバと完全に同意します。これは必然的ではありませんが、私のプログラムはクラッシュします。 "copy-delete"ロジックは "pythonsガベージコレクタが愚かな操作から一部のデータを削除できませんでした。私が気付いていないリンクがいくつかあるはずです。 Copy.deepcopyは、もしそれが正しい場合、元のオブジェクトへのすべてのリンクを削除します。したがって、削除後、古いオブジェクトはすべて完全に参照解除される必要があります。あなたは、ポジションを排除するために何かを試すことを知っています。 –