hsqldb などのデータベースに大きな配列 (10000x100) を格納する最も効率的な方法は何ですか? Javaで書いている特定の数学プログラムに対してこれを行う必要があります。助けてください。配列全体が頻繁に取得および保存されます (個々の要素はそれほど多くありません)。また、配列に関するいくつかのメタデータを配列について保存する必要があります。
11 に答える
素晴らしい質問です。
配列を正規化されたテーブルのセットに変換したくない場合を除き、シリアル化を検討することをお勧めします。
シリアライゼーションとは、オブジェクトをディスクやデータベースに保存できる形式に変換することを意味する凝った言葉です。シリアライゼーションの 2 つの主要な形式はバイナリーと XML であり、Java がそれを何らかの形でサポートしていることは間違いありません。
使用しているデータ型に応じて、配列を XML またはバイナリに変換し、それをデータベース内の 1 つのフィールドに保存できるはずです。http://java.sun.com/developer/technicalArticles/Programming/serialization/を確認することで、Java でこの手法を開始できます。私はそれが.NETに組み込まれていることを知っています。
これが役立つことを願っています。これ以上の指示があれば教えてください。
データを BLOB として格納し、Java を使用して BLOB を実際の Java 配列にデコードするのはどうですか? 配列全体を一度に格納および取得する場合ははるかに効率的ですが、個々の要素をいじる場合はひどいものになります。
XML、JSON、自分で作成したバイナリ ファイル、またはその他の形式のシリアル化など、内部表現を作成します。
「blob」データ型を使用してテーブルに保存します。マトリックスに関連付けられたメタデータを追加の列に保存します。
それを行う方法が、行列と同じ行数と列数を持つテーブルを作成することであることに強く反対します。これは、使用しない機能に対して支払う非常に高い代償です。
事前に挿入/選択ステートメントを準備し、バインド変数を使用して、作業しているマトリックスを変更します。データベースがすべてのリクエストを再解析しないようにしてください。
データが密集している場合(値のヒストグラムがフラットラインに近い場合)、Object [Output /Input]Streamを使用したblobとシリアル化が最適です。
それ以外の場合は、スパース配列とEntity-Attribute-Valueスキーマのバリエーションを使用する方が効率的であることがわかります。次に例を示します。
Name | IndexKey | Value
------+-----------+-------
foo | 'default' | 39
foo | 0:0:0 | 23
foo | 0:0:1 | 34
foo | 1:5:0 | 12
...
bar | 1:3:8 | 20
bar | 1:3:8 | 23
bar | 1:1:1 | 24
bar | 3:0:6 | 54
...
これにより、テーブルの一部をすばやく更新し、SQLの「like」演算子を使用してスライスを選択することもできます。
ディメンションの数が固定されている場合、キー列を分割して各ディメンションのint列を分離し、インデックスの効率を向上させ、より柔軟な選択基準を設定します(デフォルト値などのメタデータに最初のインデックス「null」を使用できます) 。
いずれの場合も、Name、IndexKey列にクラスター化インデックスを作成することをお勧めします。
配列が1つしかない場合は、バイナリファイルを使用してみませんか?
すでに示唆されているように、機能が必要ない場合は RDBMS を使用しないでください。ただし、シリアル化の代わりに、ディスク上のインデックスの管理などのデータベースのような機能を提供するJDBMなどの低レベル API を検討することをお勧めします。
配列が保持するデータでテーブルを定義し、配列値をテーブルに挿入します。
これは非常に単純なデータ アクセス/ストレージです。配列の次元は常に同じですか?
- 1 つの大きな明示的なトランザクションでそれを行います。データベース システムに、挿入ごとに新しい暗黙的なトランザクションを強制的に作成させないでください。
- 準備済みステートメントを使用します。
PostgreSQL には配列のサポートが組み込まれています。
BLOB として格納されたバイト配列への Java シリアル化が最善の策です。Java は大きな配列を非常に効率的にシリアライズします。クエリを実行したり、簡単に表示したりすることに関心がある場合は、残りの行の列を使用してください。BLOB 以外のデータを頻繁にクエリおよびレポートする場合は、BLOB を独自のテーブルに保持し、「通常の」行が「BLOB」行を指すようにすることをお勧めします (ただし、これはデータベースの実装によって異なります)。 )。
HSQLDB 2.0 は、テーブルの列として格納される 1 次元配列をサポートします。したがって、テーブルの各行は 2D 配列の 1 行に対応します。
ただし、2D 配列全体を取得する場合は、BLOB が最適なソリューションです。