2024-06-09 18:48:53 发布
网友
我使用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应该随着分页而收缩。根据应用程序的活动模式(您从未描述过),这些“冷”页面可能永远不会被引用,因此,尽管VSZ很大,但您的长生命周期的python进程最终会占用较小的内存。在
如果你的应用程序可以运行24小时,有时读取15个MiB文件,内存数稳定,那么它就不会泄漏。第一次文件读取将膨胀内存数字,但只要随后的文件读取不会导致单调地增加内存消耗,您应该处于良好的状态。在
如果您对占用空间感到非常不安,请考虑告诉您的长寿命应用程序使用multiprocessing来分离短生命的解析器进程。它们将调用sbrk()、sbrk()、sbrk(),然后exit(),所有资源都将立即被回收。在
可能是lxml调用了malloc(),后者调用了sbrk()。虚拟内存永远不会变小。在
但这并不是世界末日。ps-VSZ可能永远不会收缩,但是在其他进程的内存压力下,RSS应该随着分页而收缩。根据应用程序的活动模式(您从未描述过),这些“冷”页面可能永远不会被引用,因此,尽管VSZ很大,但您的长生命周期的python进程最终会占用较小的内存。在
如果你的应用程序可以运行24小时,有时读取15个MiB文件,内存数稳定,那么它就不会泄漏。第一次文件读取将膨胀内存数字,但只要随后的文件读取不会导致单调地增加内存消耗,您应该处于良好的状态。在
如果您对占用空间感到非常不安,请考虑告诉您的长寿命应用程序使用multiprocessing来分离短生命的解析器进程。它们将调用sbrk()、sbrk()、sbrk(),然后exit(),所有资源都将立即被回收。在
相关问题 更多 >
编程相关推荐