GNU Octave でスパースバイナリマトリックスを操作しようとしていますが、予想よりも多くのメモリを使用しており、関連するスパース マトリックス関数が意図したとおりに動作しません。MATLAB での予想よりも高いスパース行列ストレージに関するこの質問が表示されます。これは、この行列がさらに多くのメモリを消費する必要があることを示唆していますが、この状況の一部 (のみ) を説明するのに役立ちました。
まばらなバイナリ マトリックスの場合、Octave に値の配列を格納しないようにする方法がわかりません(値は常に暗黙的1
に格納されるため、格納する必要はありません)。これはできますか?Octave は常に値配列のためにメモリを消費するようです。
状況を示す簡略化された例: ランダムな疎行列を作成し、それを「バイナリ」に変換します。
mys=spones(sprandn(1024,1024,.03)); nnz(mys), whos mys
状況を示します。ストレージクラスspones()
の配列を作成し、すべてdouble
のインデックスが 32 ビット (つまり、
TotalStorageSize - rowIndices - columnIndices == NumNonZero*sizeof(double)-- これらの値 (すべて
1
s を s としてdouble
) を不必要に格納すると、この 3% 疎オブジェクトによって消費される合計メモリの半分以上になります。
この質問を作成している間にこれを(あまりにも長く)いじった後、いくつかの部分的な回避策を発見したので、継続性のために質問の一部を「自己回答」(のみ)します(うまくいけば)が、わかりませんでした主な質問に対する適切な答えを出してください:
Octave で効率的に格納された ("no-/implicit-values") バイナリ マトリックスを作成するにはどうすればよいですか?
ストレージ形式に関する追加の背景情報は次のとおりです...
Octave のドキュメントによると、スパース行列のストレージ形式はCompressed Sparse Column (CSC)という形式を使用します。これは、次の配列を格納することを意味しているようです (前述の SO answerを拡張し、正規のYale 形式 labels
と列優先順の微調整を使用):
- 値(
A
)、ストレージ クラス サイズのゼロ以外の数 (NNZ) エントリ。 - 行番号(
IA
)、インデックス サイズの NNZ エントリ (うまくいけばint64
、しかし多分int32
); - 各列の開始(
JA
)、列数にインデックス サイズの 1 エントリを加えたもの)
この場合、バイナリのみのストレージの場合、配列 ( ) の格納を完全に回避する方法があることを願っていますA
が、それがわかりません。