在清除树时使用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也以这种方式工作。所以,你不应该指望在解释的大小topps永远下降,即使堆内存的使用。