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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析XML后,Python不会释放内存相关的知识,希望对你有一定的参考价值。

我正在使用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不会释放它!为什么会这样,是否有任何解决方法?

答案

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

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

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

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

以上是关于解析XML后,Python不会释放内存的主要内容,如果未能解决你的问题,请参考以下文章

python中的多处理不会释放内存

使用非utf-8编码在Python中解析XML

scikit Grid Search 和 Python 通常不会释放内存

如何释放lxml.etree使用的内存?

在 Objective-C 中使用 TBXML 时的内存泄漏

python中如何释放字典的内存占用?