1

JVM ヒープ領域をいっぱいにしています。

パラメーターを変更して JVM により多くのヒープ スペースを与えるか、コード内のアルゴリズムの何かを変更してあまり多くのスペースを使用しないようにすることは、最も推奨される 2 つのオプションです。

しかし、これらの 2 つが既に試行されて適用されていて、それでもメモリ不足の例外が発生する場合は、他のオプションが何であるかを確認したいと思います。

この「巨大な行列にメモリマップファイルを使用する」という例と、私の問題を解決する興味深い方法であるHugeCollectionsというライブラリについて知りました。残念ながら、このライブラリは 1 年以上更新されておらず、どの Maven リポジトリにもありません。そのため、私にとっては本当に信頼できるものではありません。

私の質問は、これを行う他のライブラリ、またはそれを達成する良い方法 (コレクション オブジェクト (リストとセット) のメモリをマップすること) はありますか?

4

4 に答える 4

6

どのような種類のコレクションを使用しているか、どのように使用しているかについては言及していないため、推奨するのは困難です。ただし、次の点に注意してください。

  • オブジェクトを Java ヒープに保持するのが常に最も簡単なオプションであり、RAM は比較的安価です。
  • やみくもにメモリ マップト データに移動すると、パフォーマンスが大幅に低下する可能性が非常に高くなります。特に、ファイル内を移動したり、多くの変更を行ったりしている場合はなおさらです。ハッシュベースのコレクション タイプは、データを分散することによって機能するため、最悪です。一般に、ツリー ベースのコレクション型がより適切な選択であり、線形コレクションは両方の方法で使用できます。
  • オフヒープに移動したら、オブジェクトを Java との間で変換する方法が必要です。オブジェクトのシリアル化は最も簡単ですが、多くのオーバーヘッドが追加されます。通常は、バイト バッファー経由でアクセスするバイナリ オブジェクトを選択することをお勧めしますが、スレッドを意識する必要があります。
  • また、オフヒープ オブジェクトのガベージ コレクションを独自に管理する必要があります。作成/更新するだけなら問題ありませんが、削除するとすぐに面倒になります。
  • 大量のデータがあり、さまざまな方法でそのデータにアクセスする必要がある場合は、おそらくデータベースが最適です。
于 2012-10-09T15:05:10.887 に答える
3

Unluckily, the library hasn't seen an update for over a year, and it's not in any Maven repo - so for me it's not a really reliable one納得して書きました。;)

より高いパフォーマンスが少し使用されているhttps://github.com/peter-lawrey/Java-Chronicleを見ることをお勧めします。実際にはリストとキュー用に設計されていますが、追加のデータ構造を持つマップまたはセットに使用できます。

要件に応じて、独自のライブラリを作成できます。たとえば、時系列データの場合、残念ながらオープンソースではありませんが、500 GB 以上のテーブルをきれいにロードできる別のライブラリを作成しました。

Mavenリポジトリにはありません

どちらもこれではありませんが、誰かが追加してくれると嬉しいです.

于 2012-10-09T13:55:11.517 に答える
1

メモリリークやその他の問題がなく、ヒープに収まらないほどのストレージが本当に必要であると仮定すると(私はそうは思わないでしょう)、基本的に1つのオプションしかありません。

データをヒープに置かないでください。そのような単純な。現在、データを移動するために使用する方法は、要件(どのような種類のデータ、更新の頻度、実際のデータ量)によって大きく異なります。

注:64ビットVMで非常に大きなヒープを使用でき、必要に応じてOSのスワップスペースを拡大できます。最大ヒープサイズを残酷に増やすのが最も簡単な解決策かもしれません(それが多くのスワッピングを意味する場合でも)。私は確かにあなたが概説した状況でそれを最初に試みるでしょう。

于 2012-10-09T13:32:17.550 に答える
1

メモリ リークに問題があるか、大きすぎるオブジェクトをメモリに入れようとしているようです。

データの読み込みに必要なメモリ量を概算してみましたか?

于 2012-10-09T13:24:44.327 に答える