Pythonで多数のxmlファイルから情報を抽出する最も効率的な方法は何ですか?
-
19-08-2019 - |
質問
複数のフィールドの内容を抽出する必要があるXMLファイルのディレクトリ(〜10 3 、10 4 )があります。 私はさまざまなxmlパーサーをテストしましたが、コンテンツを検証する必要がないため(高価)、xml.parsers.expat(最速)を使用してファイルを1つずつ抽出し、データ。
- より効率的な方法はありますか? (単純なテキストマッチングは機能しません)
- 新しいファイル(または文字列)ごとに新しいParserCreate()を発行する必要がありますか、またはすべてのファイルに同じものを再利用できますか?
- 警告がありますか?
ありがとう!
解決
最も簡単な方法は、XMLを解析する代わりに文字列を(たとえば、正規表現を使用して)一致させることです。XMLによっては、実際に機能する可能性があります。
しかし、最も重要なことはこれです。いくつかのオプションを検討する代わりに、それらを実装し、小さなセットで時間を計ります。これにはほぼ同じ時間がかかり、実際の数字があなたを前進させます。
編集:
- ファイルはローカルドライブまたはネットワークドライブにありますか?ネットワークI / Oはここであなたを殺します。
- 問題は平凡に並列化されます-複数のコンピューター(またはマルチコアコンピューター上の複数のプロセス)に作業を分割できます。
他のヒント
通常、ElementTreeの iterparse
を使用することをお勧めします。速度、 lxml に相当します。また、処理(2.6に組み込まれています)を使用して並列化を試みます。
event
で重要なことは、要素(サブ)構造が解析されるときに取得することです。
import xml.etree.cElementTree as ET
xml_it = ET.iterparse("some.xml")
event, elem = xml_it.next()
この場合、 "end"
は常に文字列<=>になりますが、パーサーを初期化して、解析される新しい要素について通知することもできます。その時点ですべての子要素が解析されるという保証はありませんが、それだけに関心がある場合は属性があります。
別のポイントは、イテレータからの要素の読み取りを早期に、つまりドキュメント全体が処理される前に停止できることです。
ファイルが大きい場合(そうですか?)、ストリーミングパーサーのようにメモリ使用量を一定に保つ一般的なイディオムがあります。
XMLファイルが常に同じアルゴリズムを使用して生成されていることがわかっている場合、XML解析をまったく行わない方が効率的です。例えば。データが3行目、4行目、5行目にあることがわかっている場合は、ファイルを1行ずつ読み取ってから正規表現を使用できます。
もちろん、ファイルが機械生成されていない場合、異なるジェネレーターから生成されている場合、またはジェネレーターが時間とともに変化する場合、そのアプローチは失敗します。しかし、私はそれがより効率的であると楽観的です。
パーサーオブジェクトをリサイクルするかどうかは、ほとんど関係ありません。さらに多くのオブジェクトが作成されるため、単一のパーサーオブジェクトは実際にはそれほど重要ではありません。
あなたが示していないことの1つは、XMLを何らかのDOMに読み込んでいるかどうかです。おそらくそうではないと思いますが、偶然ではありません。代わりにxml.saxを使用してください。 DOMの代わりにSAXを使用すると、パフォーマンスが大幅に向上します。