2012-06-26 61 views
1

我正在使用elementtree.ElementTree.iterparse解析一個大的(371 MB)xml文件。爲什麼elementtree.ElementTree.iterparse使用這麼多內存?

我的代碼基本上是這樣的:

outf = open('out.txt', 'w') 
context = iterparse('copyright.xml') 
context = iter(context) 
dummy, root = context.next() 

for event, elem in context: 
    if elem.tag == 'foo': 
     author = elem.text 

    elif elem.tag == 'bar': 
     if elem.text is not None and 'bat' in elem.text.lower(): 
      outf.write(elem.text + '\n') 
    elem.clear() #line A 
    root.clear() #line B 

我的問題是雙重的:

首先 - 我是否需要A和B(見代碼片斷評論)?我被告知root.clear()清除了不必要的子元素,因此內存不會被吞噬,但這裏是我的觀察結果:使用B而不是A與使用內存消耗(使用任務管理器繪製)無關。僅使用A似乎與使用兩者相同。

第二 - 爲什麼這仍然消耗這麼多的記憶?程序運行時,它在結尾處使用大約100 MB的RAM。

我認爲這與outf有關,但爲什麼?它不是隻寫磁盤嗎?如果它在存儲結束之前存儲這些數據,我該如何避免這種情況?

其他信息: 我在Windows上使用Python 2.7.3。

回答

2

(代碼已發佈,第二行縮進,不應該運行。) http://bugs.python.org/issue14762是一個類似的問題,答案是你應該清除每個元素(A行)。沒有看到什麼是(或創建它的代碼),很難回答第二個問題。如果它是一個StringIO對象,答案會很明顯。你可能會看一看跟蹤問題的第二個消息中鏈接的教程:

http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python-with-elementtree/

+0

謝謝你的第一部分。在第二部分中,我編輯了這個問題以包含創建outf的代碼行。 – russell

0

使用xml.etree.cElementTree.iterparse(),而不是[在Python 2.x的。

生命太短,無法調試其他人的錯誤。

+0

在Python 3中,不建議使用'cElementTree'。我相信它在可用時會自動使用。 –

+0

好的,謝謝@TerryJanReedy。 – smci

相關問題