問題タブ [iterparse]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - lxml と iterparse を使用してサブ要素を取得する
XML ドキュメントから効率的にデータを取得するための解析アルゴリズムを作成しようとしています。現在、要素と子に基づいてドキュメントを読み進めていますが、代わりに iterparse を使用したいと考えています。1 つの問題は、見つかったときに子データをプルしたい要素のリストがあることですが、iterparse を使用すると、1 つの要素名に基づいてフィルター処理するか、すべての要素を取得するオプションがあるようです。
XML の例:
コード例:
python - elementtree.ElementTree.iterparse が大量のメモリを使用するのはなぜですか?
大きな (371 MB) xml ファイルを解析するために elementtree.ElementTree.iterparse を使用しています。
私のコードは基本的にこれです:
私の質問は 2 つあります。
最初 - A と B の両方が必要ですか (コード スニペットのコメントを参照)。root.clear() は不要な子をクリアするため、メモリが消費されないと言われましたが、ここに私の観察があります: A ではなく B を使用することは、メモリ消費の点でどちらも使用しないことと同じです (タスクマネージャーでプロット)。A のみを使用することは、両方を使用することと同じようです。
2 番目 - なぜこれでもメモリを大量に消費するのでしょうか? プログラムが実行されると、最後に約 100 MB の RAM が使用されます。
outfと関係があると思いますが、なぜですか?ディスクへの書き込みだけではありませんか?また、outf が閉じる前にそのデータを保存している場合、どうすればそれを回避できますか?
その他の情報: Windows で Python 2.7.3 を使用しています。
python - ElementTree の iterparse にかかる時間はどれくらいですか?
別の質問に答える際に、誰かが次のチュートリアルを見せてくれました。著者は iterparse を使用して 3 秒以内に ~100 MB の XML ファイルを解析したと主張しています。
http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python-with-elementtree/
~90 MB の XML ファイルを解析しようとしていますが、次のコードがあります。
約30秒かかります...同様のサイズのファイル、同様のアルゴリズム、および同じパッケージを使用して読んだチュートリアルで報告されたものと同じ大きさではありません.
誰かが私のコードの何が問題なのか、または私の状況とチュートリアルの違いに気付いていない可能性があることを教えてもらえますか?
Python 2.7.3 を使用しています。
補遺:
誰かがそうかもしれないと思った場合に備えて、私はかなり強力なマシンも使用しています。
python - Pythonで巨大で正しくエンコードされていないXMLファイルを解析する
私は外部XMLファイルを解析するコードに取り組んできました。これらのファイルのいくつかは巨大で、最大ギガバイトのデータです。言うまでもなく、これらのファイルをメモリにロードするのは非常に非効率的であり、OutOfMemoryの問題を引き起こすことが多いため、これらのファイルをストリームとして解析する必要があります。
私はライブラリminiDOM、ElementTree、cElementTreeを使用しており、現在lxmlを使用しています。現在、を使用して、動作する、かなりメモリ効率の高いスクリプトがありlxml.etree.iterparse
ます。問題は、解析する必要のあるXMLファイルの一部にエンコードエラーが含まれていることです(UTF-8としてアドバタイズされますが、エンコードが異なる文字が含まれています)。これを使用する場合、カスタムパーサーのオプションをlxml.etree.parse
使用して修正できますが、カスタムパーサーは受け入れません。(参照:この質問)recover=True
iterparse
私の現在のコードは次のようになります。
iterparse
悪い文字(この場合は)に遭遇したときのエラー^Y
:
このデータをデコードしたくはありません。ドロップするだけです。ただし、要素をスキップする方法がわかりません。try /exceptステートメントを試してみましたcontext.next
。continue
どんな助けでもいただければ幸いです!
アップデート
いくつかの追加情報:これは、iterparseが失敗する行です:
<description><![CDATA:[musea de la photographie fonds mercator. Met meer dan 80.000 foto^Ys en 3 miljoen negatieven is het Muse de la...]]></description>
etreeによると、エラーはバイトで発生します0x19 0x73 0x20 0x65
。
hexeditによると、19 73 20 65
ASCIIに変換されます.s e
。.
この場所にはアポストロフィ(写真)が必要です。
私はまた、解決策を提供しないこの質問を見つけました。
python - lxml.etree.iterparse() がすべてのメモリを消費するのはなぜですか?
これにより、最終的に使用可能なメモリがすべて消費され、プロセスが強制終了されます。タグを「小さい」タグに変更しようとしましたschedule
が、違いはありませんでした。
何が間違っているのですか / この大きなファイルを で処理するにはどうすればよいiterparse()
ですか?
私はそれを簡単に切り刻んで小さな塊に加工することができますが、それは私が望むよりも醜いです.
python - 名前空間の宣言に一貫性がないドキュメントでは、iterparseを使用し、その後xpathを使用します
おそらく大きなXMLファイルをカスタムPythonオブジェクトに解析するコードをまとめる必要があります。アイデアは大まかに次のとおりです。
問題は、一部のドキュメントには名前空間宣言があり、一部には名前空間宣言がないことです。つまり、上記のコードでは、tag='Foo'
とxpath
パーツの両方が機能しません。
今のところ私は醜いことに我慢してきました
しかし、これはひどいので、うまく機能していても、正しく処理したいと思います。(私もそれが遅いはずだと思います。)
を使用して両方のケースを説明する健全なコードを書く方法はありますiterparse
か?今のところ、私はキャッチstart-ns
とend-ns
イベント、および「状態保持」変数の更新についてのみ考えることができます。これは、作業を行うためにループ内で呼び出される関数に渡す必要があります。次に、関数はそれxpath
に応じてクエリを作成します。これは理にかなっていますが、これを回避するもっと簡単な方法があるのではないかと思います。
PS私は明らかに周りを検索しようとしましたが、名前空間の有無にかかわらず機能する解決策を見つけられませんでした。XMLから名前空間を削除するソリューションも受け入れますが、プロセスでツリー全体がRAMに格納されない場合に限ります。
python - 後続の .clear() のために、子の子を反復処理できませんか?
チュートリアルの「イベント駆動型解析」セクションで説明されているパターンを使用しようとしています。lxml
私のコードでは、iterchildren()
メソッドを使用して要素に対して再帰的に実行できる関数を呼び出しています。ここでは、例として 2 つのネストされたループを使用します。
これは期待どおりに機能します。
出力は<Element d at 0x2df49b0>
です。
しかし.clear()
、最後に追加すると:
-- 何も印刷されません。なぜそうなるのですか? また、これを回避するにはどうすればよいですか?
ノート:
- スキップ
iterchildren
して、for c in elem
またはを実行for c in list(elem)
しても、同じ効果があります。 - メモリ使用量を低く抑えるには、反復アプローチを使用する必要があります。
実際の使用例では、属性を使用して要素の検索を行っています。
/li>
内部要素が処理される前に消去する方法clear
と、先祖の処理に必要な間、それらをメモリに保持する方法について説明してください。
python - ElementTree 反復解析戦略
十分な大きさ (最大 1GB) の xml ドキュメントを処理し、python で解析する必要があります。iterparse()関数 (SAX スタイルの解析)を使用しています。
私の懸念は次のとおりです。このようなxmlがあると想像してください
もちろん、問題は、私がいつ姓を取得するのか (シンプソンズとして)、いつその家族の一員の名前を取得するのか (たとえば、ホーマー) を知ることです。
私がこれまでやってきたことは、「メンバー」タグの中にいるかどうかを教えてくれる「スイッチ」を使用することです。コードは次のようになります
そして、これは出力が
私の懸念は、この(単純な)例では、どのタグ(on_members_tag)であるかを知るために追加の変数を作成する必要があったことです。処理する必要がある真のxmlの例を想像してみてください。それらには、より多くのネストされたタグがあります。
また、これは非常に縮小された例であるため、より多くのタグ、より多くの内部タグを含む xml に直面し、さまざまなタグ名、属性などを取得しようとしている可能性があると想定できます。
それで質問です。私はここでひどく愚かなことをしていますか?これにはもっとエレガントな解決策が必要だと思います。
python - cElementTree.iterparse() 使用時にエラーが発生するノードをスキップする方法
非常に大きな XML ファイルを解析し、小文字を使用して句読点を削除しようとしています。問題は、for big files を使用してこのファイルを解析しようとするとcET parse function
、ある時点で不適切な形式のタグまたは文字が発生することsyntax error
です。
注: ファイルを読み取ることはほぼ不可能なので、どこに問題があるのかわかりません。
これをスキップまたは修正するにはどうすればよいですか?