数学的な文脈からスパース行列を考えていると思います:
http://en.wikipedia.org/wiki/Sparse_matrix (そこで説明されている保存手法は、永続ストレージ (低ディスク) ではなく、メモリ ストレージ (高速算術演算) 用です利用方法)。)
通常、サーバー側ではなくクライアント側でこの行列を操作するため、SQL-ARRAY[] が最適です。
問題は、マトリックスのスパース性をどのように利用するかです。ここで、いくつかの調査の結果を示します。
設定:
- ポストグル 8.4
- 倍精度 (8 バイト) の 400*400 要素を持つ行列 --> 行列ごとに 1.28MiB の raw サイズ
- 33% の非ゼロ要素 --> 行列あたり 427kiB の有効サイズ
- ~1000 の異なるランダムに入力された行列を使用して平均化
競合する方法:
- SET STORAGE MAIN または EXTENDED を使用した列の自動サーバー側圧縮に依存します。
- ゼロ以外の要素と、マトリックス内のゼロ以外の要素の場所を説明するビットマップ( )のみを格納します。
bit varying(xx)
(1 つの倍精度は 1 ビットの 64 倍です。理論的には (オーバーヘッドを無視して)、<=98% が非ゼロの場合、この方法は改善されるはずです ;-)) サーバー側の圧縮が有効になっています。
- 行列のゼロを NULLに置き換えます。(RDBMS は NULL の格納に非常に効果的です。) サーバー側の圧縮がアクティブになります。
(2 番目の index-ARRAY[] を使用したゼロ以外の要素のインデックス付けはあまり有望ではないため、テストされていません。)
結果:
- 自動圧縮
- 追加の実装作業は不要
- ネットワーク トラフィックが減少しない
- 最小限の圧縮オーバーヘッド
- 永続ストレージ = raw サイズの 39%
- ビットマップ
- 許容可能な実装作業
- ネットワーク トラフィックがわずかに減少しました。スパース性に依存
- 永続ストレージ = raw サイズの 33.9%
- ゼロを NULL に置き換える
- いくつかの実装作業 (API は、INSERT クエリの構築中に ARRAY[] のどこにどのように NULL を設定するかを知る必要があります)
- ネットワークトラフィックに変化なし
- 永続ストレージ = raw サイズの 35%
結論: EXTENDED/MAIN ストレージ パラメータから始めます。空き時間がある場合は、データを調査し、スパース レベルで私のテスト セットアップを使用してください。しかし、その効果はあなたが期待するよりも低いかもしれません。
マトリックスのシリアル化 (例: 行優先順) に加えて、マトリックスの次元 NxM に対して 2 つの整数列を常に使用することをお勧めします。ほとんどの API はテキスト SQL を使用するため、ネストされた "ARRAY[ARRAY[..], ARRAY[..], ARRAY[..], ARRAY[..], ..]" のネットワーク トラフィックとクライアント メモリを大幅に節約できます。 !!!
テバス
CREATE TABLE _testschema.matrix_dense
(
matdata double precision[]
);
ALTER TABLE _testschema.matrix_dense ALTER COLUMN matdata SET STORAGE EXTERN;
CREATE TABLE _testschema.matrix_sparse_autocompressed
(
matdata double precision[]
);
CREATE TABLE _testschema.matrix_sparse_bitmap
(
matdata double precision[]
bitmap bit varying(8000000)
);
すべてのテーブルに同じ行列を挿入します。具体的なデータは、特定のテーブルに依存します。未使用のページが割り当てられているため、サーバー側のデータを変更しないでください。または、VACUUM を実行します。
SELECT
pg_total_relation_size('_testschema.matrix_dense') AS dense,
pg_total_relation_size('_testschema.matrix_sparse_autocompressed') AS autocompressed,
pg_total_relation_size('_testschema.matrix_sparse_bitmap') AS bitmap;