2 年前のようにいくつかの関連する質問が投稿されているのを見てきましたが、最近解決策が出てきたかどうか知りたいです。
私は辞書の巨大な辞書を持っています。私のメモリには約 4 つの辞書 (それぞれ 500 MB のサイズ) があります。プログラムを実行し続けると、これら 4 つの辞書の 1 つを削除し、OS 用にメモリを解放する必要があります。そのため、以前の投稿で述べたように、メモリ割り当てのために新しいサブプロセスを開始することはできません。
問題を説明するためのコードを次に示します。
import cPickle
import resource
import gc
import time
mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
print "memory usage:", mem
test_dict = {}
for i in range(100000):
test_dict[i] = "AAAAAAAA"
if i%10000 == 0:
mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
print "memory usage:", mem
mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
print "memory usage: (dict created): ", mem
del test_dict
mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
print "mem usage: (dict deleted)", mem
gc.collect()
mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
print "mem usage (garbage collection)", mem
print "sleeping for a few seconds"
time.sleep(30)
gc.collect()
mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
print "memory usage after sleeping ", mem
これが結果です。メモリは KB 単位で報告されます。
memory usage: 5152
memory usage: 8316
memory usage: 9176
memory usage: 9176
memory usage: 12076
memory usage: 12076
memory usage: 12076
memory usage: 12076
memory usage: 12076
memory usage: 12076
memory usage: 17548
memory usage: (dict created): 17548
mem usage: (dict deleted) 17548
mem usage (garbage collection) 17548
sleeping for a few seconds
memory usage after sleeping 17548
ご覧のとおり、メモリはまったく解放されていないようです。Python 2.7.2を搭載したUbuntu 11.10マシンでこれを試しました