0

私はJavaが初めてです。この 2 GB の xml ファイルがあり、そのデータを解析してデータベースに保存する必要があります。

StackOverflow の誰かが、長い xml ファイルに Dom4j を使用することを勧めてくれました。解析はうまくいっていますが、(Dom4j によって) 返されたドキュメントは非常に長く、繰り返しですべての DOM オブジェクトがメモリ (ヒープ) にロードされます。

これにより、メモリ不足の異常が発生します。このようなエラーを回避する方法を教えてください。Java でのオンデマンドのヒープ割り当てとデポジットについて、Java で何らかの現象が発生していますか?

4

2 に答える 2

5

次の 2 つの選択肢があります。

  1. JVM を再構成して、より多くの最大メモリを割り当てます (-Xmx2g などを使用)。詳しくはこちらをご覧ください。このオプションは、OS とシステムの空きメモリの量によっても明らかに制限されます。
  2. すべての XML を一度にメモリにロードするのではなく、プロセスを通じてストリーミングするストリーミングAPI ( SAXなど) を使用して、ドキュメント全体をメモリに保持せずに分析できるようにします。

最初のオプションはすぐに役立つ可能性があり、この質問に固有のものではありません。2 番目のオプションは、あらゆるサイズのドキュメントを分析できるため、よりスケーラブルなソリューションです。もちろん、分析結果のメモリ消費について心配する必要がありますが、それはまったく別の問題です。

于 2013-06-10T09:56:15.423 に答える
1

大きな XML ファイルを解析する必要がある (Java ヒープへの追加が常に機能するとは限らない) 場合は、DOM ツリー全体をメモリにロードする代わりに XML ストリームを解析できる SAX パーサーが必要です。

SAXDOMIXもチェックしてください

SAXDOMIX には、XML ドキュメントの解析中に SAX イベントまたは DOM サブツリーをアプリケーションに転送できるクラスが含まれています。このフレームワークは、アプリケーションが SAX 解析の途中で DOM サブツリーを取得できるようにする単純なインターフェイスを定義します。処理後、すべての DOM サブツリーがガベージ コレクションの対象になります。これにより、DOM のスケーラビリティの問題が解決されます。

于 2013-06-10T09:57:07.327 に答える