質問
hsqldbなどのデータベースに大きな配列(10000x100)を保存する最も効率的な方法は何ですか?私はJavaで書いている特定の数学プログラムのためにこれを行う必要があります。助けてください。 配列全体が頻繁に取得され、保存されます(個々の要素ではありません)。また、配列に関するメタデータを配列について保存する必要があります。
解決
すばらしい質問。
配列を正規化されたテーブルのセットに変換したくない場合は、そうではないように聞こえますが、シリアル化を検討することをお勧めします。
シリアル化は、オブジェクトを、ディスクまたはデータベースに保存できる形式に変換するための空想的な言葉です。シリアル化の2つの主要なフォーマットはバイナリとXMLであり、Javaがそれをサポートしていると確信しています。
使用しているデータ型に応じて、配列をXMLまたはバイナリに変換し、それをデータベースの単一フィールドに保存できる必要があります。 Javaでこの手法を開始するには、 http://java.sunをチェックアウトしてください。 com / developer / technicalArticles / Programming / serialization / 。 .NETに組み込まれていることは知っています。
これが役立つことを願っています。指示があれば教えてください。
他のヒント
データをBLOBとして保存し、Javaを使用してBLOBを実際のJava配列にデコードするのはどうですか?配列全体を1つのグループに格納および取得する場合ははるかに効率的ですが、個々の要素をいじる場合はひどいものになります。
XML、JSON、自分で思いつくバイナリファイル、またはその他の形式のシリアル化など、内部表現に対応します。
" blob"を使用してテーブルに保存します。データ・タイプ。マトリックスに関連付けられているメタデータを追加の列に保存します。
それを行う方法は、マトリックスと同じ行数と列数を持つテーブルを作成することであることに強く反対します。これは、使用しない機能に対して非常に高い代償を払うことになります。
事前にinsert / selectステートメントを準備し、バインド変数を使用して作業中のマトリックスを変更します。すべてのリクエストをデータベースで再解析しないでください。
配列が1つしかない場合、バイナリファイルを使用しないのはなぜですか?
すでに提案されているように:機能が必要ない場合は、RDBMSを使用しないでください。シリアル化の代わりに、管理のような機能のようなデータベースを提供する JDBM のような低レベルAPIを検討することもできます。ディスク上のインデックス。
データが密集している場合(値のヒストグラムが平坦な線に近い場合)、最善の選択は、blobとObject [Output / Input] Streamを使用したシリアル化です。
それ以外の場合は、スパース配列と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つの大きな明示的なトランザクションで実行します。データベースシステムに、挿入ごとに新しい暗黙的なトランザクションを強制的に作成させないでください。
- 準備されたステートメントを使用します。
PostgreSQLには配列の組み込みサポートがあります。
BLOBとして保存されたバイト配列へのJavaシリアル化が最善の策です。 Javaは大きな配列を非常に効率的にシリアル化します。クエリを実行したり、すぐに表示したい場合は、残りの行の列を使用します。また、BLOBを独自のテーブルに保持し、「通常」を保持することをお勧めします。行は" BLOB"を指します。行、非BLOBデータをクエリおよびレポートする場合(ただし、これはデータベースの実装によって異なる場合があります)。
HSQLDB 2.0は、テーブルの列として格納される1次元配列をサポートします。したがって、表の各行は2D配列の1行に対応します。
ただし、2D配列全体を取得する場合は、BLOBが最適なソリューションです。