3

別の質問に答える際に、誰かが次のチュートリアルを見せてくれました。著者は iterparse を使用して 3 秒以内に ~100 MB の XML ファイルを解析したと主張しています。

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

~90 MB の XML ファイルを解析しようとしていますが、次のコードがあります。

from xml.etree.cElementTree import *
count = 0

for event, elem in iterparse('foo.xml'):        
    if elem.tag == 'identifier' and elem.text == 'bar':
        count += 1
    elem.clear() # discard the element

print count

約30秒かかります...同様のサイズのファイル、同様のアルゴリズム、および同じパッケージを使用して読んだチュートリアルで報告されたものと同じ大きさではありません.

誰かが私のコードの何が問題なのか、または私の状況とチュートリアルの違いに気付いていない可能性があることを教えてもらえますか?

Python 2.7.3 を使用しています。

補遺:

誰かがそうかもしれないと思った場合に備えて、私はかなり強力なマシンも使用しています。

4

1 に答える 1

4

TJDが述べたように、XMLのサイズだけを比較することは、あまり有益ではないかもしれません。ただし、同じ構造でサイズが異なるファイルがあります。

79Mファイルの場合:

$ python -m timeit -n 1 -c 'from xml.etree.cElementTree import iterparse
count = 0
for event, elem in iterparse("..../QT20060217_S_18mix23-2500_01.mzML"):
    if elem.tag.endswith("spectrum"): count += 1
    elem.clear()
print count'
6126
6126
6126
1 loops, best of 3: 950 msec per loop

3.8Gファイルの場合、timeit出力は次のようになります。

1 loops, best of 3: 22.3 sec per loop

また、次のように比較してください。最初の行をlxml変更すると、次のようになります。xml.etree.cElementTreelxml.etree

最初のファイルの場合:730 msec per loop

2番目のファイルの場合:11.4 sec per loop

于 2012-06-28T19:38:31.220 に答える