2017-03-28 4 views
-1

多くのパッケージを使用する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) 
+1

の上に次のコードを追加することにより、スクリプトを実行可能に作られていることを確認しますがロジックを関数に入れ、その関数を終了すると、メモリを解放するのに十分なはずです。 – dabadaba

+2

解決策はほとんどの場合、「すべての変数をコピーして削除する」ことではありません。 –

+0

私はダバダバと完全に同意します。これは必然的ではありませんが、私のプログラムはクラッシュします。 "copy-delete"ロジックは "pythonsガベージコレクタが愚かな操作から一部のデータを削除できませんでした。私が気付いていないリンクがいくつかあるはずです。 Copy.deepcopyは、もしそれが正しい場合、元のオブジェクトへのすべてのリンクを削除します。したがって、削除後、古いオブジェクトはすべて完全に参照解除される必要があります。あなたは、ポジションを排除するために何かを試すことを知っています。 –

答えて

0

が使用このコードを使用すると、次のコードを使用し$ chmod a+x yourpgm.py$ ./yourpgm.pyようなスクリプトを実行している場合は、$ python yourpgm.py

os.execv(sys.executable, ['python'] + sys.argv) 

を、次のようなスクリプトを実行している場合、スクリプトを再起動しますプログラムを再起動します。

os.execv(__file__, sys.argv) 

いずれにせよ、SYSモジュールをインポートすることを忘れないでください:

import sys 

あなたがコード

#!/usr/bin/env python 
+0

ありがとうございます。それは私の問題を解決しました。解決策が質問に追加されました。 –

関連する問題