Pythonには既知のメモリリークがありますか?私はを使用して、以下のスニペットのようなコードを持つPythonスクリプトを作成しています。何らかの理由でメモリリークが発生しています。この例の "while True
"は、関数を呼び出すことによって発生したリークをテストすることです。これは、Python 2.5.4とWindows上で実行されている:Python:構造体のCTypesメモリリーク
import ctypes
def hi():
class c1(ctypes.Structure):
_fields_=[('f1',ctypes.c_uint8)]
class c2(ctypes.Structure):
_fields_=[('g1',c1*2)]
while True:
test=hi()
リークがProcessExplorerを使用して試験することができる - それがループし続けると、Pythonは、より多くのメモリを占有し続けます。 2つのStructureサブクラスが必要です.1つのクラスには(*
演算子を使用して)他のものの「倍数」がありますが、条件がそれより基本的かどうかはわかりません。ループにdel test
が追加されても、それでもメモリがリークします。
何が原因で起こっている可能性がありますか?
編集:誰かがそれはまだガベージコレクションを持っていない可能性があります示唆したので、ここではガベージコレクトん編集されたバージョンがあるが、まだメモリリークが発生する表示されます。
import gc
import ctypes
def hi():
class c1(ctypes.Structure):
_fields_=[('f1',ctypes.c_uint8)]
class c2(ctypes.Structure):
_fields_=[('g1',c1*2)]
while True:
test=hi()
test2=gc.collect()
どのくらい漏れますか? 'c1'ごとに1バイトずつ作成されますか?あなたが知っているように、「hi()」への50,000回の呼び出しごとに印刷されたカウンタを持ってください。 – agf
ProcessExplorerでは、「ワーキングセット」のメモリは毎秒約20〜30 KBずつ着実に増加し、たびに「プライベートバイト」がそれに追いつきます。約12分後、私は既に59 MBのメモリを超えていて、通訳で実行されている2番目のスニペットを数えています。どれくらいのメモリが使用されているかを示すコード内にカウンタを配置するにはどうすればよいですか?誰かがこれについて私を裏付けることはできますか? – user553702
最も簡単な方法は、 'itertools import count'を先頭に追加し、' while True: 'を' count(): 'に変更し、' if not c%50000:print c'をループに追加することです。次に、 'print'sがあまりにも頻繁であるか、あまりにも稀で有用でない場合は、' 50000'を増減してください。 – agf