1

大きな(186MB)XMLファイルを繰り返し解析しようとしています。ファイル自体は、複雑なMyNodeTypeノードの単なるリストです。例えば、

<MyNodeTypeList>
    <MyNodeType>
        ...
    </MyNodeType>
    <MyNodeType>
        ...
    </MyNodeType>
    <MyNodeType>
        ...
    </MyNodeType>
</MyNodeTypeList>

ファイルを繰り返し解析することでメモリ使用量を低く抑えようとしていますが、30kレコード前後で大幅に遅くなり、92kで停止するようです。以下のような単純なコードでも、このプロセスはメモリ内で約2GBを消費します。

import xml.etree.cElementTree as ET

def main(argv):
    it = ET.iterparse(argv[0])
    count = 0
    for (ev, el) in it:
        if (ev == "end" and el.tag == "MyNodeType"):
            count += 1
    print count

if __name__ == "__main__":
   main(sys.argv[1:])

メモリ使用量の観点から処理コードを最小限に抑える方法はありますか?

4

1 に答える 1

3

のこの動作iterparse文書化されています:

iterparseは、parseと同じようにツリーを構築しますが、解析中にツリーの一部を安全に再配置または削除できることに注意してください。

ツリー全体をメモリに保持しないようにするには、例で提供されている方法を使用します。

# get an iterable
context = iterparse(source, events=("start", "end"))

# turn it into an iterator
context = iter(context)

# get the root element
event, root = context.next()

for event, elem in context:
    if event == "end" and elem.tag == "record":
        ... process record elements ...
        root.clear()
于 2012-10-30T16:38:46.937 に答える