2

質問 1: 密行列と疎行列を格納する専用のデータベースはありますか? 私はグーグルで検索しましたが、何も見つかりませんでした...

問題の行列は巨大 (10^5 x 10^5) ですが、まばらです。つまり、その値のほとんどはゼロであり、ゼロ以外の値のみを保存する必要があります。ということで、こんな表を作ってみました。

   2D Matrix
---------------
  X   Y   val
---------------
  1   2    4.2
  5   1    91.0
  9   3    139.1

等々。3 列、2 列は座標、3 列目はスパース行列のセルの値です。質問 2: これはスパース行列を格納する最良の方法ですか? MongoDB も検討しましたが、マトリックスのセルごとに 1 つのドキュメントを作成するのはオーバーヘッドが大きすぎるようです。テーブル指向のデータベースは遅いですが、VoltDB を使用できます :) サイドノード: Redis ハッシュを考えましたが、2 次元にすることはできません (2D マトリックスをシリアル化して 1D にする方法を見つけました。その方法で保存できます) Redis ハッシュまたはリスト)

質問 3: VoltDB は 1 行あたり何バイトを使用しますか? 座標は 0 から 10^5 の範囲の整数になり、セルの値は float になります。

4

2 に答える 2

2

最も関連性の高い 2 つの質問は、1) どのくらいまばらですか? 2) データをどのように使用しますか?

まず、データベース内からデータを読み取り/書き込み/処理する必要があると想定しています。そうでない場合は、ブロブにパックしてオプションで圧縮することもできる疎行列エンコーディングが多数あります。

データがかなりまばらで、データベース内でデータを使用したいと仮定すると、x,y,value タプル ストレージがおそらく最適です。VoltDB プランニング ガイドの第 4 章では、メモリ使用量の見積もりとハードウェアのサイジングについて説明しています。

http://community.voltdb.com/docs/PlanningGuide/ChapMemoryRecs

簡単に言えば、数値データを含むテーブルは非常に密集しているということです。行ごとに 12 バイトの実データ (short、short、double) があります。行あたりのオーバーヘッドで、それを超える平均 1 バイト強が表示されるはずです。インデックスのサイズも追加する必要があります。ドキュメントには、最悪のケースが記載されています。X 列と Y 列などの 2 つの短い整数のインデックスの場合、キーごとのストレージはオーバーヘッドを含めて 28 バイト近くになると思います。

于 2012-06-06T18:19:45.043 に答える
2

質問 3 に関して、あなたの例に基づいて、X 列と Y 列は VoltDB の INTEGER データ型である可能性があり、これは 4 バイトです。値列は、8 バイトの FLOAT データ型にすることができます。

したがって、各レコードは 16 バイトになるため、メモリ内の公称サイズは 16 バイト * 行数になります。一般に、オーバーヘッドに 30% を追加し、ヒープ サイズにサーバーごとに 1GB を追加して、必要な全体的なメモリを決定します。詳細については、以下の参考文献を参照してください。

おそらくこのテーブルにインデックスを付ける必要があるため、(x,y) の複合インデックスが必要であると仮定すると、サイズは次のようになります。

ツリー インデックス: (列サイズの合計 + 8 + 32) * 行数 ハッシュ インデックス: (((2 * 行数) + 1) * 8) + ((列サイズの合計 + 32) * 行数)

(x,y) の列サイズの合計は 8 バイトです。

参考文献:

利用可能なデータ型は、 VoltDBの使用の付録 A に一覧表示されてい ます。

メモリ サイズを見積もるためのガイドラインと式は、VoltDB プランニング ガイド ( http://community.voltdb.com/docs/PlanningGuide/ChapMemoryRecs ) にあります。

于 2012-06-06T17:32:37.363 に答える