1

大きな (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 を使用しています。

4

2 に答える 2

2

(投稿されたコードの 2 行目がインデントされているため、実行しないでください。) http://bugs.python.org/issue14762も同様の問題で、各要素 (行 A) をクリアする必要があるという回答がありました。outf とは何か (またはそれを作成したコード) を確認しないと、2 番目の質問に答えることは困難です。それが StringIO オブジェクトであれば、答えは明らかです。トラッカーの問題の 2 番目のメッセージにリンクされているチュートリアルをご覧ください。

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

于 2012-06-26T22:37:22.757 に答える
0

xml.etree.cElementTree.iterparse()代わりに [Python 2.x で]を使用してください。

他の人のバグをデバッグするには、人生は短すぎます。

于 2014-08-18T16:43:16.807 に答える