CRSフォーマット
まず、圧縮形式について 1 分間紹介します。与えられたマトリックス
+---+---+---+---+
| A | 0 | B | 0 |
+---+---+---+---+
| 0 | C | 0 | 0 |
+---+---+---+---+
| 0 | 0 | D | E |
+---+---+---+---+
ublas::compressed_matrix
行ごとのゼロ以外の数、列インデックス、およびゼロ以外の各エントリの値を保存すると、圧縮行ストレージ (CRS) 形式 (の既定の形式) で非常に効率的に保存できます。
+---+---+---+
number of non-zeros | 2 | 1 | 2 |
+---+---+---+
+---+---+---+---+---+
column index | 0 | 2 | 1 | 2 | 3 |
+---+---+---+---+---+
+---+---+---+---+---+
value | A | B | C | D | E |
+---+---+---+---+---+
注:さまざまなバリエーションがあります。たとえば、ゼロ以外の数 (NNZ) の代わりに、各行の最初の要素へのインデックスをcolumn index
およびvalue
ベクトルに格納することもできます。または、これらの値へのポインターを新しい行の開始位置などに格納することもできます。ただし、それらはすべて多かれ少なかれ同じ量のメモリを必要とします。
メモリ要件
CRSフォーマットに必要なメモリはおおよそ
memoryRequired = numberOfRows * sizeof(index_type)
+ NNZ * sizeof(index_type)
+ NNZ * sizeof(value_type)
さらに、配列の長さ、データへのポインターなどを格納するためのオーバーヘッドが発生します。ただし、データ自体が必要とするメモリと比較すると、圧縮された行列は非常に大きくなる傾向があるという事実 (それ以外の場合は密な行列を使用できます) を考えると、このオーバーヘッドは通常無視できます。
あなたの例では
m
行、m
列、3*m
ゼロ以外のエントリを含む CRS 行列を で割り当てようとしm
てい10^8
ます。uint32
インデックスにdouble
as type を使用し、エントリに as typeを使用すると仮定すると、これには次の量のメモリが必要になります。
NNZ vector m * 4 = 381.5 MB
column index vector 3*m * 4 = 1144.4 MB
value vector 3*m * 8 = 2288.8 MB
-----------------------------------------
total 3814.7 MB
そのため、既にマトリックスには約 4 GB のメモリが必要です。いくつかのベクトルも保存したい場合、従来のデスクトップ マシンではすぐにメモリ不足になります。