在清除树时使用ElementTree.iterparse()时是否应该增加内存使用量?
问题内容:
import os
import xml.etree.ElementTree as et
for ev, el in et.iterparse(os.sys.stdin):
el.clear()
在ODP结构上运行上述操作RDF转储会导致始终增加内存。这是为什么?我了解ElementTree仍会建立一个解析树,尽管带有子节点clear()
ed。如果这是造成此内存使用模式的原因,那么有没有解决的办法?
问题答案:
您正在查看clear
每个元素,但对它们的引用仍保留在根文档中。因此,仍然无法对各个元素进行垃圾回收。请参阅ElementTree文档中的讨论。
解决方案是清除根目录中的引用,如下所示:
# get an iterable
context = iterparse(source, events=("start", "end"))
# turn it into an iterator
context = iter(context)
# get the root element
event, root = context.next()
for event, elem in context:
if event == "end" and elem.tag == "record":
... process record elements ...
root.clear()
关于内存使用情况要记住的另一件事(可能不会影响您的情况)是,一旦VM从系统分配内存用于堆存储,它通常就不会再退还该内存。大多数Java
VM也以这种方式工作。所以,你不应该指望在解释的大小top
或ps
永远下降,即使堆内存的使用。