我看过两年前发布的一些相关问题,但我想知道最近是否有任何解决方案。
我有一本庞大的字典词典。我的记忆中大约有4个词典(每个500 MB大小)。当我继续运行程序时,我需要删除这4个字典中的一个并将内存释放到操作系统。因此,我不可能像以前的一些帖子中提到的那样开始一个新的内存分配子进程。
以下是一些用于说明问题的代码:
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
正如你所看到的,内存似乎根本没有释放。我在我的Ubuntu 11.10机器上用Python 2.7.2
尝试了这个答案 0 :(得分:5)
根据man getrusage
:
ru_maxrss (since Linux 2.6.32) This is the maximum resident set size used (in kilobytes).
如果我理解正确,则意味着峰值使用,而不是当前用法。
修改强>
另外值得查看Python官方文档中的Memory Management文章。
答案 1 :(得分:4)
正如Ihor Kaharlichen所指出的,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,然后再次下降。您的程序表现出相同的行为。