解析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不会释放内存的主要内容,如果未能解决你的问题,请参考以下文章
scikit Grid Search 和 Python 通常不会释放内存