Python没有释放内存

Isa*_*aac 6 python garbage-collection

我一直在使用XML资源,并且似乎Python正在发出奇怪的行为。我已经测试了lxml库和库xml.etree.ElementTree,两者都应在收集内存之后才由gc。我输入gc.collect()了一个测试,但没有其他反应:内存仍由进程保留。

进口:

import time
from lxml import etree
import gc
Run Code Online (Sandbox Code Playgroud)

这是代码:

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()
Run Code Online (Sandbox Code Playgroud)

这是我的主要

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

如您所见,此主体调用“ 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)]
Run Code Online (Sandbox Code Playgroud)

Isa*_*aac -5

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

经过一番尝试后,多亏了 Martijn Pieters,一个解决方案出现了。呼唤

len(gc.get_objects())
Run Code Online (Sandbox Code Playgroud)

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