大きな (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
私の質問は 2 つあります。
最初 - A と B の両方が必要ですか (コード スニペットのコメントを参照)。root.clear() は不要な子をクリアするため、メモリが消費されないと言われましたが、ここに私の観察があります: A ではなく B を使用することは、メモリ消費の点でどちらも使用しないことと同じです (タスクマネージャーでプロット)。A のみを使用することは、両方を使用することと同じようです。
2 番目 - なぜこれでもメモリを大量に消費するのでしょうか? プログラムが実行されると、最後に約 100 MB の RAM が使用されます。
outfと関係があると思いますが、なぜですか?ディスクへの書き込みだけではありませんか?また、outf が閉じる前にそのデータを保存している場合、どうすればそれを回避できますか?
その他の情報: Windows で Python 2.7.3 を使用しています。