Python cElementTree采用2GB RAM来迭代解析大文件

时间:2012-10-30 15:53:41

标签: python file-io xml-parsing

我正在尝试迭代解析一个大的(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:])

在内存使用方面,我是否可以通过某种方式将处理代码保持在最低限度?

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()