2011-01-22 16 views
5

多くのサブ要素を含む大きなxmlファイルがあります。私はいくつかのxpathクエリを実行できるようにしたい。私はJavaでvtd-xmlを使ってみましたが、xmlがメモリに収まるほど大きいので、時々outofmemoryエラーが出ます。そのような大きなxmlを処理する別の方法がありますか?あなたが今やろうとしているどのような大きなファイル大きなxmlファイルの処理

+0

なぜこの質問にPythonタグがありますか?人々がPythonソリューションを提供することを望んでいますか? – Spaceghost

+0

ドキュメントを解析するときやxpathクエリを実行するときにメモリ不足が発生しますか? 2番目の場合、おそらく問題はxpathクエリです。 いずれにせよ、JVMのヒープのために-Xmxの値を増やしてみましたか? – Spaceghost

+0

拡張vtd-xmlを試して、メモリマッピングオプションを使用してください –

答えて

2

は非常に効率的ですか?そのサウンドによって、DOMベースのパーサを使用しようとしています。パーサは、XMLファイル全体をDOM表現としてメモリにロードします。大きなファイルを扱う場合は、XML文書をストリーミング形式で処理するSAXパーサを使用する方がよいでしょう。

これは個人的にはStAXをお勧めします。

+1

XPathをダイレクトSAXストリームで使用することはできません(クエリごとにファイル全体を再解析することはできません)。 –

+0

@Glenn Maynard - 確かにOP *は各クエリ(またはクエリのバッチ)ごとにファイルを再解析する必要があります。 DOMは大きすぎてメモリに収まりません。 –

0

標準vtdまたは拡張VTD-xmlを使用しましたか?拡張XMLを使用する場合は、メモリマッピングを使用するオプションがあります。これを試しましたか?

0

XPathを使用すると、長期間使用するアプリケーションで多くの式を動的にコンパイルすることはできません。

XPathのJavaバージョンがどのように機能するのかは完全にはわかりませんが、.NET XPathでは動的アセンブリをコンパイルしてアプリドメインに追加します。後で式を使用すると、アセンブリにメモリにロードされます。
XPathを使用していた状況では、この同じタイプのメカニズムがメモリリークと同様にメモリをいっぱいにしていました。

私の理論では、各式がユーザーの値を使用してコンパイルされるたびに、コンパイルされた各式は固有の可能性が高いため、新しい式がコンパイルされてアプリドメインに追加されました。
アプリケーションドメイン全体を再起動せずにアプリケーションドメインからアセンブリを削除することができるため、式が評価されるたびにメモリが消費され、回復できませんでした。その結果、コードはメモリ内のアセンブリの形でメモリをリークしていましたが、しばらくして結果が分かりました。

関連する問題