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.如果这是这种内存使用模式的原因,有没有办法解决它?
您正在使用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也以这种方式工作.因此,即使未使用堆内存,您也不应期望解释器的大小会减小top或ps减少.