Python 2.6で書かれたプログラムは、多くの短命のインスタンスを作成します(これは古典的なプロデューサ/コンシューマの問題です)。私は、これらのインスタンスが作成され、決して元に戻ってこないと、topとpmapによって報告されるメモリ使用量が増加するように見えることに気付きました。私が使用していたいくつかのPythonモジュールがメモリをリークしている可能性があることを懸念していましたので、私のコードで問題を慎重に切り離しました。私は可能な限り短い例でそれを再現しました。あなたは「のpython2.6 -i memoryleak.py」のようなものでこれを実行した場合、それは停止します、あなたはメモリ使用量をチェックするには、pmap -x PIDを使用することができますPython 2.6 GCがオブジェクトをクリーンアップするのに表示されますが、メモリは解放されません。
class LeaksMemory(list):
timesDelCalled = 0
def __del__(self):
LeaksMemory.timesDelCalled +=1
def leakSomeMemory():
l = []
for i in range(0,500000):
ml = LeaksMemory()
ml.append(float(i))
ml.append(float(i*2))
ml.append(float(i*3))
l.append(ml)
import gc
import os
leakSomeMemory()
print("__del__ was called " + str(LeaksMemory.timesDelCalled) + " times")
print(str(gc.collect()) +" objects collected")
print("__del__ was called " + str(LeaksMemory.timesDelCalled) + " times")
print(str(os.getpid()) + " : check memory usage with pmap or top")
:私はこれを思い付きました。 delメソッドを追加して、GCが発生していることを確認できました。私の実際のプログラムにはありませんし、機能的な違いはありません。 leakSomeMemory()を呼び出すたびに、このプログラムが消費するメモリ量が増えます。私はいくつかの単純な誤りを犯していることを恐れ、その参照は偶然に保管されているが、それを特定することはできません。
をあなたはしばらく待っていれば、メモリの消費量が戻ってダウンして行くのでしょうか?私の理解では、Pythonはプールから割り当てを行うため、プールを拡張する必要がある場合、メモリを解放した直後にプールを縮小することはありません。 –