2

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マシンでこれを試しました

4

2 に答える 2

5

によるとman getrusage

ru_maxrss (since Linux 2.6.32)
    This is the maximum resident set size used (in kilobytes).

私がそれを正しく理解していれば、現在の使用量ではなくピーク使用量を意味します。

編集:

また、Python の公式ドキュメントのメモリ管理の記事も参照する価値があります。

于 2012-08-17T13:03:31.280 に答える
4

Ihor Kaharlichenko が指摘するようru_maxrssに、プログラムのピーク使用量です。あなたのものと非常によく似た次のプログラムを考えてみましょう:

import time
time.sleep(10)
string = ' ' * int(5e8) # 500 MB string
time.sleep(10)
string = None # the huge string is automatically GC'd here
time.sleep(10)

これのメモリ使用量を監視するtopと、最初の 10 秒間は非常に小さく、しばらくの間 500 MB まで急上昇し、その後再び低下することがわかります。あなたのプログラムは同じ動作を示します。

于 2012-08-17T13:07:27.863 に答える