1

サイズが2.6GBの単一のXMLファイルを読み取っています。JVMのサイズは6GBです。

しかし、まだヒープスペースのメモリ不足エラーが発生していますか?

私はここで何を間違っているのですか...

参考までに、JVMの最大メモリと空きメモリのプロパティを出力します--

最大メモリは約5.6GBと表示されていましたが、空きメモリは90MBのみと表示されていました...特に90MBのみが空きとして表示されているのはなぜですか。処理を開始していないとき...プログラムを開始したばかりですか?

4

4 に答える 4

8

一般に、構造化テキストを Java の対応するデータ構造に変換する場合、入力ファイルのサイズよりも多くのスペースが必要です。文字列に必要なスペースとは別に、使用されるさまざまなデータ構造に関連する多くのオーバーヘッドがあります。

たとえば、各Stringインスタンスには約 32 ~ 40 バイトの追加のオーバーヘッドがあります。言うまでもなく、各文字は2バイトで格納されるため、ASCII でエンコードされた XML のスペース要件は事実上 2 倍になります。

次に、文字列を構造体に格納するときに追加のオーバーヘッドが発生します。たとえば、Stringインスタンスを に格納するMapには、実装と使用量の測定方法に応じて、約 16 ~ 32 バイトの追加のオーバーヘッドが必要になります。

解析済みの 2.6 GB の XML ファイルを一度に保存するには、6 GB では不十分な可能性があります...

結論:

このような大きな XML ファイルを (DOM パーサーを使用して) メモリにロードしている場合は、おそらく何か問題があります。SAX などのストリームベースのパーサーには、はるかに控えめな要件が必要です。

または、XML ファイルを組み込みデータベースや実際のサーバーベースのデータベースなど、より使いやすいファイル形式に変換することを検討してください。これにより、はるかに大きなドキュメントを問題なく処理できます。

于 2012-12-28T16:55:45.200 に答える
1

xml 全体を一度にメモリにロードすることは避け、代わりに大量の xml を処理できる特殊なクラスを使用する必要があります。

于 2012-12-28T16:57:41.460 に答える
1

ここには潜在的にいくつかの異なる問題があります。

しかし、初心者のために:

1) 64 ビット OS を使用している場合は、64 ビット JVM を使用していることを確認してください。

2) 開いているすべてのリソースをできるだけ早くコードで閉じるようにします。

3) 完了した大きなオブジェクトへの参照を明示的に「null」に設定します。

... と ...

4) JConsoleまたはVisualVMに慣れる:

于 2012-12-28T16:58:03.917 に答える
1

2.6 GB の XML イメージを 6 GB のドキュメントとしてロードすることはできません。jhordo が示唆するように、比率は 12 対 1 である可能性が高くなります。これは、すべてのバイトが 16 ビット文字に変換され、すべてのタグ、属性、および値が少なくとも 32 バイトのオーバーヘッドを持つ文字列に変換されるためです。

代わりに、SAX またはイベント ベースのパーサーを使用してファイルを段階的に処理する必要があります。このようにして、保持する必要のあるデータのみを保持します。1 回のパスですべてを処理できる場合は、何も保持する必要はありません。

于 2012-12-28T17:04:29.537 に答える