我正在尝试迭代解析一个大的(186MB)XML文件。文件本身只是复杂MyNodeType节点的列表。如,
<MyNodeTypeList>
<MyNodeType>
...
</MyNodeType>
<MyNodeType>
...
</MyNodeType>
<MyNodeType>
...
</MyNodeType>
</MyNodeTypeList>
我试图通过迭代解析文件来保持较低的内存使用率,但它似乎在大约减慢约3万条记录并且停止在92k停止。该过程在内存中占用大约2GB,即使使用如下的简单代码:
import xml.etree.cElementTree as ET
def main(argv):
it = ET.iterparse(argv[0])
count = 0
for (ev, el) in it:
if (ev == "end" and el.tag == "MyNodeType"):
count += 1
print count
if __name__ == "__main__":
main(sys.argv[1:])
在内存使用方面,我是否可以通过某种方式将处理代码保持在最低限度?
答案 0 :(得分:3)
iterparse
的此行为是documented:
请注意,iterparse仍然构建一个树,就像解析一样,但是你可以在解析时安全地重新排列或删除部分树
为避免将整个树保留在内存中,请使用示例中提供的方法:
# 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()