我正在使用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不会释放它! 为什么会这样,是否有任何解决方法?
答案 0 :(得分:1)
可能是lxml调用了malloc(),它调用了sbrk()。然后虚拟内存永远不会变小。
但这不是世界末日。 ps VSZ可能永远不会缩小,但在其他进程的内存压力下,RSS应该通过pageout缩小。根据您从未描述过的应用程序的活动模式,这些“冷”页面可能永远不会被再次引用,因此尽管VSZ很大,但您的长寿python进程会占用很少的内存。
如果你的应用程序可以运行24小时,有时读取15个MiB文件,内存号码稳定,那么它就不会泄漏。第一个文件读取会使内存数字膨胀,但只要后续文件读取不会导致内存消耗单调增加,就应该保持良好状态。
如果您对脚印非常不满,请考虑告诉您长期存在的应用使用multiprocessing来分离短暂的解析器进程。他们将调用sbrk(),sbrk(),sbrk(),然后退出(),并立即回收所有资源。