Python在Linux中没有释放内存

Python在Linux中没有释放内存,python,memory,memory-management,Python,Memory,Memory Management,我在两年前看到过一些相关的问题,但我想知道最近是否有任何解决方案 我有一本很大的字典。我的内存中大约有4本字典(每本500 MB大小)。当我继续运行程序时,我需要删除这4个字典中的一个,并释放内存到操作系统。因此,我不可能像前面的一些文章中提到的那样开始一个新的内存分配子进程 下面是一些代码来说明这个问题: import cPickle import resource import gc import time mem = resource.getrusage(resource.RUSAGE_

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

我有一本很大的字典。我的内存中大约有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

正如你所看到的,记忆似乎根本没有释放出来。我用Python2.7.2在我的Ubuntu11.10机器上尝试了这个,根据
ManGetRusage

如果我理解正确,它的意思是峰值使用量,而不是当前使用量

编辑:


同样值得一看Python官方文档中的文章。

正如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的峰值,然后再次下降。您的程序表现出相同的行为。

谢谢!您知道有什么方法可以从脚本本身中获取Python的内存使用率,而不是使用其他程序(如top或pst)吗?这很容易测试,只需将该函数添加到代码中,并在每次旧的打印后打印其输出。根据我的测试,
memory\u usage()['rss']
看起来是一个合理的值,删除字典后*确实会减少。+1谢谢。所以,我认为我在处理实际程序中的内存泄漏。@Phani,不,你不是。在只使用内置模块的Python程序中,内存泄漏的可能性非常小。我指的是一些仍然引用的对象,它们没有被GC'd。此外,我发现ru_maxrss所指的内容存在矛盾。你能看看这个吗。这是我脚本的基础,但它现在似乎与顶级报告不匹配。@dbaupp-是的,仅仅因为Python进行垃圾收集,不要认为它不会受到内存泄漏的影响。这不仅仅是旧的C-风格的泄漏“我malloc'ed,但没有免费”。更像是,“我保留了一个对对象的额外引用,所以GC不会释放它。”这种情况会在备忘录或模块级容器(列表、dict、set等)中发生,尤其是在导入的模块中,您可能没有意识到保留了一个额外的引用。
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)