3

lxml etree.parse を使用して、どういうわけか巨大な XML ファイル (約 65MB ~ 300MB) を解析しています。以下の関数を含むスタンドアロンの Python スクリプトを実行すると、メモリ割り当てエラーが発生します。

Error:

     Memory allocation failed : xmlSAX2Characters, line 5350155, column 16

機能コードの一部:

def getID():
        try:
            from lxml import etree
            xml = etree.parse(<xml_file>)  # here is where the failure occurs
            for element in xml.iter():
                   ...
                   result = <formed by concatenating element texts>
            return result
        except Exception, ex:
            <handle exception>

奇妙なことに、IDLE で同じ関数を入力し、同じ XML ファイルをテストすると、MemoryAllocation エラーは発生しません。

この問題に関するアイデアはありますか?前もって感謝します。

4

1 に答える 1

3

代わりに反復パーサーを使用してドキュメントを解析し、処理.clear()が完了した任意の要素を呼び出します。そうすれば、ドキュメント全体を一度にメモリにロードする必要がなくなります。

反復パーサーを、関心のあるタグのみに制限できます。タグのみを解析したい場合は<person>、パーサーに次のように伝えます。

for _, element in etree.iterparse(input, tag='person'):
    # process your person data
    element.clear()

ループ内の要素をクリアすると、メモリから解放されます。

于 2012-06-01T19:04:38.590 に答える