import json
import time
from itertools import count
def keygen(size):
for i in count(1):
s = str(i)
yield '0' * (size - len(s)) + str(s)
def jsontest(num):
keys = keygen(20)
kvjson = json.dumps(dict((keys.next(), '0' * 200) for i in range(num)))
kvpairs = json.loads(kvjson)
del kvpairs # Not required. Just to check if it makes any difference
print 'load completed'
jsontest(500000)
while 1:
time.sleep(1)
Linuxのトップ pythonのプロセスは 'jsontest' 関数の完了後にRAMの〜450MBを保持していることを示しています。 'json.loads'への呼び出しが省略されている場合、この問題は発生しません。 A gc.collectこの関数実行後はメモリを解放しません。PythonのJSONメモリ肥大化
gc.collectの明示的な呼び出しがメモリを解放しているので、メモリがキャッシュまたはPythonの内部メモリアロケータに保持されていないように見えます。
ガベージコレクション(700,10,10)のしきい値に達していないため、これは起こっていますか?
jsontestの後にコードを入力して、しきい値をシミュレートしました。しかし、それは役に立たなかった。
jsontestを複数回呼び出しても、メモリは〜450MBのままです。これは最後のjsontestコールで使用されたメモリですか?このコードは、jsonメッセージを処理するwebappの一部です。 webappを1時間実行しても、メモリは解放されていないようです。 gc.collect以外の回避策がありますか? – Anoop
'jsontest'を呼び出すたびに' gc.get_count() 'を表示してみてください。また、 'gc.collect'を呼び出すのに何が問題になりますか? –