2012-10-30 93 views
1

我想迭代地解析一個大的(186MB)XML文件。該文件本身只是一個複雜的MyNodeType節點列表。例如,Python cElementTree需要2GB的RAM來迭代地解析大文件

<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:]) 

有一些方法可以讓我保持的加工代碼到最低限度在內存使用方面?

回答

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

工作!謝謝! –