2

私は約30MBのXMLファイルを持っています。その中には約300000個の要素があります。

このファイルを処理するには、次のコードを使用します。

xmldoc=xml.dom.minidom.parse("badges.xml")

csv_out=open("badge.csv","w")

for badge in xmldoc.getElementsByTagName("row"):
    some processing here
    csv_out.write(line)

ファイルはわずか30MBですが、このスクリプトをMBP(10.7、8G RAM)で実行すると、約3GBのメモリを使用します。なぜこのような単純なスクリプトとこのような小さなファイルがこれほど多くのメモリを使用するのでしょうか。

よろしくお願いします、

4

3 に答える 3

5

XMLステートメントをチャンクで処理する反復パーサーに切り替える必要があります。これにより、その間のメモリをクリアできます。DOM パーサーは、ドキュメント全体を一度にメモリにロードします。

標準ライブラリには、SAX パーサーElementTree.iterparseオプションの両方が用意されています。

簡単な反復解析の例:

from xml.etree.ElementTree import iterparse

with open("badge.csv","w") as csvout:
    for event, elem in iterparse("badges.xml"):
        if event == 'end' and elem.tag == 'row': # Complete row tag
            # some processing here
            csv_out.write(line)
            elem.clear()

.clear()呼び出しに注意してください。これにより、要素が解放され、メモリから削除されます。

于 2012-09-06T15:31:49.657 に答える
0

非常に大きなxmlファイルでlxmlを使用していますが、問題はありません。

ubuntuシステムでこれを行う必要があったため、インストールのヘルプについては、このstackoverflowの記事を参照してください。

pip インストール lxml エラー

于 2012-09-06T15:49:40.707 に答える
0

DOM タイプの XML パーサーは、ドキュメント全体をロードするため、大量のメモリを使用する可能性があります。30MB のファイルに対して 3GB は多すぎるように思われるので、別のことが起こっている可能性があります。

ただし、SAX スタイルの XML パーサー ( Python ではxml.sax ) を検討することをお勧めします。このタイプのパーサーでは、コードは、パーサーが処理するときに、コールバックを介して各要素 (タグ、テキストなど) を認識します。SAX スタイルのパーサーはドキュメント構造を保持しません。実際、考慮されるのは単一の XML 要素だけです。このため、高速でメモリ効率が高くなります。解析のニーズが複雑な場合は作業が面倒になる可能性がありますが、あなたのニーズはかなり単純なようです。

于 2012-09-06T15:35:14.070 に答える