1

我正在尝试迭代解析一个大的(186MB)XML 文件。该文件本身只是复杂 MyNodeType 节点的列表。例如,

<MyNodeTypeList>
    <MyNodeType>
        ...
    </MyNodeType>
    <MyNodeType>
        ...
    </MyNodeType>
    <MyNodeType>
        ...
    </MyNodeType>
</MyNodeTypeList>

我试图通过迭代解析文件来保持较低的内存使用率,但它似乎会严重减慢大约 30k 的记录,并在 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:])

就内存使用而言,有什么方法可以将处理代码保持在最低限度?

4

1 回答 1

3

这种行为iterparse记录在案

请注意,iterparse 仍然会构建树,就像 parse 一样,但是您可以在解析时安全地重新排列或删除树的某些部分

为避免将整个树保留在内存中,请使用示例中提供的方法:

# 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()
于 2012-10-30T16:38:46.937 回答