7

cの2つのブールスパース正方行列があります。12BM のデータから生成された 80,000 x 80,000 (GB のデータを使用すると、桁違いに大きな行列になる可能性があります)。

それらを乗算したい(これにより三角行列が生成されます-ただし、内積を制限して三角行列を生成しないため、これは得られません)。

それらを乗算する最良の方法 (メモリと速度の観点から) を考えています。RAM が 60 GB を超える m2.4xlarge AWS インスタンスで計算を実行します。速度の理由から、計算を RAM に保持することをお勧めします。

SciPy にはスパース行列があり、h5py にもスパース行列があることに感謝していますが、どちらの経験もありません。

最善の選択肢は何ですか?

前もって感謝します

更新: ブール行列のスパース性は <0.6% です

4

2 に答える 2

-1

--以下のコメント / DOWNVOTER を満たすように編集--

行列をすばやく簡単に乗算する方法を尋ねています。

解決策 1 : これは解決済みの問題です: numpy を使用します。これらの操作はすべて numpy で簡単に実行でき、C で実装されているため、非常に高速です。

以下も参照してください。

SciPy と Numpy には疎行列と行列乗算があります。(少なくともCで書いた場合)おそらくリンクリストを使用するため、多くのメモリを使用せず、データポイントの合計に必要なメモリとオーバーヘッドのみを使用します。そして、純粋な python ソリューションと比較して、ほぼ確実に非常に高速になります。

解決策 2

ここでの別の答えは、値を (x, y) のタプルとして格納することを提案しています。値が存在しない限り False であると仮定すると、それは true です。これに代わるものは、(x, y, 値) タプルを持つ数値行列です。

関係なく: これらを乗算するのは時間的に厄介です: 要素 1 を見つけ、乗算する他の配列要素を決定し、その特定のタプルのデータセット全体を検索し、存在する場合は、結果を乗算して結果行列に挿入します。

解決策3 (優先対解決策 2、私見)

シンプルで高速なので、私はこれを好みます。

疎行列を一連の辞書で表します。行列 1 は、(x, y) の要素と値 v (x1、y1、x2、y2 など) を持つ辞書です。

matrixDictOne = { 'x1:y1' : v1, 'x2:y2': v2, ... }
matrixDictTwo = { 'x1:y1' : v1, 'x2:y2': v2, ... }

Python dict ルックアップは O(1) であるため (実際にはそうではありませんが、おそらく log(n) に近いでしょう)、高速です。これにより、乗算の前に要素の存在について 2 番目の行列のデータ全体を検索する必要がなくなります。だから、それは速いです。掛け算を書くのは簡単で、表現を理解しやすいです。

解決策 4 (お仕置きが大食いの場合)

必要なサイズのメモリ マップト ファイルを使用して、このソリューションをコーディングします。必要なサイズの null 値でファイルを初期化します。自分でオフセットを計算し、乗算を行うときにファイル内の適切な場所に書き込みます。Linux には VMM があり、オーバーヘッドがほとんどないか、ユーザーの作業が必要です。これは、 SPARSEではないためメモリに収まらない 非常に大きな行列のソリューションです。

これにより、メモリに収まらないという以下の苦情者の苦情が解決されることに注意してください。ただし、OP はsparseと言いました。これは、実際のデータポイントが巨大な配列に分散していることを意味し、Numpy / SciPy はこれをネイティブに処理するため、適切に処理されます (Fermilab の多くの人々が Numpy / SciPy を定期的に使用しています。疎行列コードは十分にテストされています)。

于 2013-12-27T21:02:39.390 に答える