2

私はJama Matrixで働いています。LSIに使用しました。それはすべてうまくいきます。ただし、8000x8000 のような大きなマトリックスを渡すと、システム全体が停止します。私は単純に SVD を呼び出してから、行列のサイズを縮小して加算しています。他には何もありません!

何か案が?どうすればこの問題を解決できますか?

core2du

RAM = 10GB

Java ランタイム設定

-Xmx5000M

Jama マトリックス コードを実行している間、実行中の他のプログラムはありません

4

4 に答える 4

2

私はSVDにもJamaを使用していますが、大きな行列を解く際に同じ問題があります。メモリ オーバーフローのケースを減らすために、SingularValueDecomposition.java をコンパクトなものに調整しました。調整は、マトリックス A に非常に多くの 0 (ゼロ) 値があるため、A、U、V、Work などの使用されるすべてのマトリックスのコンパクトは、0 より大きい使用可能な値のメモリのみを許可することです。 r /tc /t value /n r /tc /t value /n ... '/t' と '/n' はそれぞれタブと改行を意味します。

例: (0, 0, 0), (0, 1, 0.5), (0, 2, 0), (0, 3, 0.2), (1, 0, 1), (1, 1, 0), (1, 2, 0), (1, 3, 0.3) で行列のサイズが 2*4 (R*C) の場合、MATRIXSIZE /t 2 /t 4 /n 0 /t 1 /t 0.5 のようなファイルを作成します。 /n 0 /t 3 /t 0.2 /n 1 /t 0 /t 1 /n 1 /t 3 /t 0.3 /n

使用したい場合は、メールアドレス (mg.hwang@gmail.com) を教えてください。メールで使用するための詳細をお知らせします。

結果が正しいことを確認しました。しかし、それがコンピュータにとってどれほど効果的かはわかりません。とにかく、それは機能し、それほど多くはありませんが、より良く表示されます.

于 2011-04-14T09:06:29.807 に答える
1

メモリ不足の状態に直面している可能性があります。-Xmx オプションを使用して、JVM で使用できるメモリを増やしたい場合があります。たとえば、-Xm256m を指定すると、デフォルトの 64 MB ではなく、JVM が 256 MB になります。

COO、DOK、CSR などのスパース マトリックスのモデルを使用して、メモリ効率の高いマトリックス表現を処理する代替ライブラリの使用を検討することもできます。詳細については、「スパース マトリックス」のウィキペディアのエントリを参照してください。

このスレッドでは、Jama に代わるいくつかの方法が提供されています。これも役立つかもしれません。

于 2011-01-29T08:33:50.470 に答える
0

ピーターテイラーは絶対に正しいです。

それは指数関数的な大きな問題です。結局のところ、8000 X 8000マトリックスのSVDを計算することは、64,000,000の要素を話しているので、簡単なことではありません。

JAMA MagicSquareExampleを実行する場合、次のようになります。

32x32マトリックスの経過時間は0.062秒です。
64x64は0.0328秒に
なります96x96は1.891秒で経過します
128x128は4.5秒
で160x160は11.109秒
で192x192は24.063秒で
224x224は46.063秒で256x256
は83.625秒で
512x512は1716.719秒

ここに画像の説明を入力してください

于 2011-01-30T09:48:00.930 に答える
0

LSIを実行している場合は、2つの重要な最適化を行うことができます。まず、マトリックスがスパースです(ドキュメントごとのマトリックスを使用していると仮定します)。JAMAは密度行列で動作するため、別の表現を見つけることを検討することをお勧めします。Loloが述べたように、これによりオーバーヘッドが大幅に削減されます。

第2に、LSIは上位k個の特異ベクトルのみを計算する必要があります。JAMAはすべての特異値を計算しますが、これはあなたの場合は不要です。さらに、kを最大にするだけでよい場合は、メモリのオーバーヘッドが大幅に少ないシンSVDを使用してさらに最適化できます。LSIのフルSVDを計算することは、大規模なドキュメントコレクションではほとんど不可能になるため、スケーリングする場合は、最終的にJAMA以外のものから切り替える必要があります。

SVDLIBJは、JavaでシンSVDを実行するための1つの可能性です。S-Spaceパッケージには、SVDLIBJラッパーとコマンドラインツールがあり、LSIの記述を完全に避けたい場合はLSI/LSA実装もあります。

于 2011-03-16T22:01:10.993 に答える