Python没有释放Linux中的内存

Pha*_*ani 2 python memory memory-management

我已经看过两年前发布的一些相关问题,但我想知道最近是否有任何解决方案.

我有一本庞大的字典词典.我的记忆中大约有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
Run Code Online (Sandbox Code Playgroud)

这是结果.内存以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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,内存似乎根本没有释放.我在使用Python 2.7.2的Ubuntu 11.10机器上试过这个

Iho*_*nko 5

根据man getrusage:

ru_maxrss (since Linux 2.6.32)
    This is the maximum resident set size used (in kilobytes).
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,它意味着峰值使用而不是当前使用.

编辑:

另外值得一看Python官方文档中的内存管理文章.