Python并没有释放内存

时间:2013-12-10 08:36:44

标签: python garbage-collection

我一直在使用XML资源,似乎Python发布了一种奇怪的行为。我已经测试了lxml库和xml.etree.ElementTree,它们都应该被gc收集后保留内存。我输入gc.collect()作为测试,但没有其他事情发生:内存仍然由进程保持。

进口:

import time
from lxml import etree
import gc

这是代码:

def process_alternative():
    """
    This alternative process will use lxml
    """
    filename = u"/tmp/randomness.xml"
    fd = open(filename, 'r')
    tree = etree.parse(fd)
    root = tree.getroot()

    accum = {}

    for _item in root.iter("*"):
        for _field in _item.iter("*"):
            if _field.tag in accum.keys():
                accum[_field.tag] += 1
            else:
                accum[_field.tag] = 1

    for key in accum.keys():
        print "%s -> %i" % (key, accum[key])

    fd.close()
    gc.collect()

这是我的主要

if __name__ == "__main__":
    while True:
        print "Wake up!"
        process_alternative()
        print "Sleeping..."
        time.sleep(30)

如你所见,这个主要调用“process_alternative”,然后睡觉。提供的XML文件加载内存近800Mb;所以,在time.sleep之前,内存应该被进程释放,返回到所需的基本VM内存(大约32Mb?)。相反,流程继续持有大约800Mb。

关于为什么在每次迭代后都没有释放内存的任何提示?

使用ubuntu 13.04,Python 2.7.4

此函数在每次迭代中释放内存

def check_memory():
    ac1 = [a1**5 for a1 in xrange(10000000)]
    time.sleep(5)
    ac2 = [a1**5 for a1 in xrange(10000000)]
    time.sleep(5)
    ac3 = [a1**5 for a1 in xrange(10000000)]

1 个答案:

答案 0 :(得分:-2)

我不知道为什么,但是进程仍然保留内存,即使我设置了对gc.collect()的显式调用。

经过一段时间的比赛,感谢Martijn Pieters,出现了一个解决方案。致电

len(gc.get_objects())

释放所有被访问的内存,并在不忙时将进程保留在正确的资源上。奇怪,但却是真的。