解析XML后,Python不会释放内存

时间:2017-12-25 16:33:39

标签: python xml memory-leaks lxml

我正在使用lxml来解析一些非常大的xml文件(每个大约15MB)。 虽然我在概念上做的是以下几点:

import lxml.etree as ET
def process_xmls():
    for xml_file in xml_files:
        tree=ET.parse(xml_file)
        etc. etc. 

现在,我正在调用该函数,我看到内存正在增加和增加,这是合理的。 问题是,在函数结束后 - 内存保持高位,Python不会释放它! 为什么会这样,是否有任何解决方法?

1 个答案:

答案 0 :(得分:1)

可能是lxml调用了malloc(),它调用了sbrk()。然后虚拟内存永远不会变小。

但这不是世界末日。 ps VSZ可能永远不会缩小,但在其他进程的内存压力下,RSS应该通过pageout缩小。根据您从未描述过的应用程序的活动模式,这些“冷”页面可能永远不会被再次引用,因此尽管VSZ很大,但您的长寿python进程会占用很少的内存。

如果你的应用程序可以运行24小时,有时读取15个MiB文件,内存号码稳定,那么它就不会泄漏。第一个文件读取会使内存数字膨胀,但只要后续文件读取不会导致内存消耗单调增加,就应该保持良好状态。

如果您对脚印非常不满,请考虑告诉您长期存在的应用使用multiprocessing来分离短暂的解析器进程。他们将调用sbrk(),sbrk(),sbrk(),然后退出(),并立即回收所有资源。