清除()树时使用ElementTree.iterparse()时内存使用量是否会增加?

Ped*_*lva 7 python memory-leaks elementtree

import os
import xml.etree.ElementTree as et

for ev, el in et.iterparse(os.sys.stdin):
    el.clear()
Run Code Online (Sandbox Code Playgroud)

在ODP结构上运行上述RDF转储会导致内存不断增加.这是为什么?我理解ElementTree仍然构建一个解析树,尽管有子节点clear()ed.如果这是这种内存使用模式的原因,有没有办法解决它?

wbe*_*rry 8

您正在使用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()
Run Code Online (Sandbox Code Playgroud)

关于内存使用情况的另一件事可能不会影响您的情况,一旦VM从系统中为堆存储分配内存,它通常永远不会返回内存.大多数Java VM也以这种方式工作.因此,即使未使用堆内存,您也不应期望解释器的大小会减小topps减少.