2

これが以前に尋ねられた場合は申し訳ありません(実際には解決策が見つかりませんが)。

私はプログラミングがあまり得意ではありませんが、とにかく、たくさんの Web サイトをクロールして、それらに関する情報をサーバーに保存しています。各ドキュメントに関連付けられたベクトル座標を処理するための Java プログラムが必要です (各ドキュメントに関連付けられた合計 500,000 のプラスまたはマイナスの許可を持つ約 10 億程度のドキュメント)。その行列全体の特異値分解を計算する必要があります。

Java は、明らかに、私の知る限り、これほど大きな行列を処理できません。比較的小さな配列 (約 4400 万) を作成しようとすると、ヒープ エラーが発生します。私はEclipseを使用しているので、-xmxの値を1024mに変更してみました(8GBのRAMを搭載したコンピューターを使用しているにもかかわらず、何らかの理由でこれ以上高くなりません)。

これにはどのような解決策がありますか?必要なデータを取得する別の方法はありますか? 別の方法で SVD を計算しますか? これを行うために別のプログラミング言語を使用していますか?

編集: 今のところ、それぞれに 3 つの単語が関連付けられた 10 億のエントリがあるとします。Xmx と Xms を正しく設定しています (Eclipse の実行構成から -> これは、コマンド プロンプトで java -XmsXXXX -XmxXXXX を実行するのと同じです)。

4

6 に答える 6

2

Java ヒープ領域は-Xmx(初期の大文字に注意してくださいX) オプションで設定でき、64 ビット JVM を使用していて、対応する物理メモリが利用可能であれば、1 GB をはるかに超える可能性があります。次の行に沿って何かを試す必要があります。

java -Xmx6144m ...

つまり、設計を再考する必要があります。各オブジェクトに関連するかなりのスペース コストがあり、JVM にもよりますが、通常、最小値はオブジェクトあたり約 12 ~ 16 バイトです。たとえば、aStringには約 36 ~ 40 バイトのオーバーヘッドがあります...

ドキュメントごとに 1 つのオブジェクトで簿記のオーバーヘッドがない場合でも (不可能です!)、10 億 (1,000,000,000) ドキュメント分のメモリがありません。ドキュメントごとに 1つの場合でも、int約 4 GB が必要です。

アプリケーションを再設計して、マトリックス内の疎性を利用し、可能な場合はディスク ベースのストレージを利用する必要があります。すべてを記憶に残すことは素晴らしいことですが、常に可能であるとは限りません...

于 2012-08-06T17:44:36.563 に答える
2

32 ビット JVMを使用していますか? これらは 2 GB を超えるヒープを持つことはできません。私は 1.5 GB を超えるヒープを割り当てることができませんでした。代わりに、64 ビットの JVMを使用してください。これらはより多くのヒープを割り当てることができます。

于 2012-08-06T17:47:33.270 に答える
0

今のところ、それぞれに 3 つの単語が関連付けられた 10 億のエントリがあるとします。

10 億のエントリがある場合、各エントリのサイズの 10 億倍が必要です。単語として3 x を意味する場合int、少なくともデータだけで 12 GB です。文字列として単語を意味する場合、英語には約 100K の単語しかなく、同じ量のスペースが必要になるため、単語を列挙します。

16 GB のコストが数百ドルであることを考えると、追加のメモリを購入することをお勧めします。

于 2012-08-06T18:13:03.300 に答える
0

または、それに数学を適用して、分割統治戦略を使用することもできます。これは、問題を小さな問題に分割して、同じ結果を得るということです。

SVD についてはよくわかりませんが、このページが役立つかもしれません。

http://www.netlib.org/lapack/lug/node32.html

于 2012-08-06T17:47:22.463 に答える
0

-Xms と -Xmx は異なります。s を含むものは開始ヒープ領域であり、x を含むものは最大ヒープ領域です。

それで

java -Xms512 -Xmx1024

最初に512を提供します

他の人が言ったように、これを機能させるには問題を分解する必要があるかもしれません。32 ビットまたは 64 ビットの Java を使用していますか?

于 2012-08-06T17:48:13.807 に答える
0

そのサイズのデータ​​の場合、すべてをメモリに格納することを計画しないでください。この種のデータを外部化する最も一般的な方法は、すべてをデータベースに格納し、データベース クエリを中心にプログラムを構築することです。

于 2012-08-06T17:49:36.657 に答える