7

エントリのみを含み、追加データを含まない、サイズが 180 GB (テキスト、30k * 3M) の非常に大きく疎なマトリックスがあります。行列の乗算、反転、および同様の線形代数演算を行う必要があります。乗算のためにオクターブと単純なシングルスレッド C コードを試しましたが、40GB のシステム RAM が非常に速く使い果たされ、プログラムがスラッシングを開始することがわかりました。私が利用できる他のオプションはありますか?私は、MathLab やその他の行列演算ライブラリに精通していません。

10 行と 3 M 列の 2 つの行列の単純な行列乗算とその転置を実行すると、次のエラーが発生します。

    memory exhausted or requested size too large for range of Octave's index type

同じことがMatlabで機能するかどうかはわかりません。疎行列表現と行列乗算については、別のライブラリまたはコードがあります。

4

3 に答える 3

1

非ゼロ エントリが十分に少ない場合は、適切な次元と最大非ゼロ エントリを使用してスパース行列 S を作成することをお勧めします。matlab create sparse matrixを参照してください。次に、@oleg komarov が説明したように、マトリックスをブロックにロードし、各ブロックのゼロ以外のエントリをスパースマトリックス S の正しいアドレスに割り当てます。マトリックスが十分にスパースである場合、それをロードすることが実際に直面する唯一の困難であると感じています。 . 大規模な転送オペレーターでも同様の問題がありました。

于 2013-09-15T01:24:52.473 に答える
0

ブロックで処理を実行することを検討しましたか? 転置と乗算は、ブロック マトリックス処理 ( https://en.wikipedia.org/wiki/Block_matrixを参照) で非常にうまく機能し、インデックスに関する制限を回避できます。

ただし、対角線上にないブロックが完全に空の場合にマトリックスをブロックに分解できない限り、これはマトリックスの反転には役立ちません。これは、仮定には記載されていません。

于 2013-07-07T01:47:40.417 に答える
0

Octave には、約 2GB のメモリ リソースと、行列が保持できるインデックスの最大数 (32 ビット Octave の場合) の両方に制限があります。MatLab には、すべてのメモリ リソースを使用し、ファイルをスワップするため、そのようなメモリ制限はありません。したがって、巨大なスワップファイルを設定することで MatLab を試すことができます。その後、操作を計算できます (ただし、とにかくかなり時間がかかります...)。

他のアプローチに興味がある場合は、アウトオブコア コンピューティングを調べてみてください。これは、すべてをメモリに常駐させることはできず、ディスクに保存し、データを効率的にロードする巨大なデータセットを処理する新しい方法を促進することを目的としています。必要。

実用的なアプローチとして、Blaze for Python を調べることができます (注意: まだ開発中です!)。

于 2014-06-16T14:48:53.453 に答える