メモリデータベースを使用して、何百万もの一時的な値を保存するのにどれほど効率的ですか?
-
30-09-2019 - |
質問
私のアプリケーションは現在、何百万もの保存です Double
計算の要素。これらの値は、計算の最後に実行される特定のアルゴリズムに使用される前に、一時的な値のみです。この計算が完了すると、数百万の値を破棄できます。
完全なストーリーはです ここ, 、詳細が必要な場合。
提案されたソリューションの1つは、インメモリデータベースを使用することです。
したがって、このソリューションを使用した場合、このデータベースを使用して値をテーブルに保存して現在のものを置き換えます Map<String, List<Double>>
, 、 お気に入り:
create table CALCULATION_RESULTS_XXX (
deal_id varchar2,
values number
);
(計算ごとに1つのテーブル、 XXX
計算IDです)
したがって、計算中、私は次のことをします:
- 計算が開始されると、を作成します
CALCULATION_RESULTS_XXX
テーブル。 - 値を追加する必要があるたびに、このテーブルにレコードを挿入します。
- 計算の最後に、アルゴリズムにテーブルコンテンツを使用します。
- 最後に、このテーブルをドロップします。
もう一方で説明されているように 主題, 、現在、私の計算は、30 * 1,000,000のリストとして、メモリに数百MBのデータを保存する場合があります Double
約240MBが必要です。
今質問:
- メモリ内データベースを使用すると、メモリ慰めは減少しますか?
- データベースの使用(またはテーブルの作成)、データ挿入などに関して私が注意しなければならない具体的なポイントは何ですか?
- 私は選ぶと思います H2データベース. 。それは私のニーズに最適な選択だと思いますか?
解決
問題は十分に単純であるため、実際に試してみて、(パフォーマンス)結果がどのように機能するかを確認する必要があります。
すでに単純なインメモリ構造を使用する実装があります。個人的には、Dellの最も安いコンピューターでさえ1GB+のRAMが付属していることを考えると、それに固執するかもしれません。それはさておき、データベースを1つか2つに動かすのはかなり簡単なはずです。 Sleepycat Berkerly DB(現在はOracleが所有しています...)は、SQLを使用する必要がなく、非常に効率的である必要があるためです。 (彼らはJavaをサポートしています)。
結果が有望な場合は、さらなる調査を検討しますが、ベンチマークを含め、せいぜい数日しかかかるはずです。
他のヒント
それがより速くなるかどうかはわかりませんので、試してみる必要があります。私がお勧めしたいのは、すぐにそのリストが必要ないときに、リスト全体のバッチインサートを実行することです。価値を節約しないでください:)
エンドアルゴリズムをSQLで表現できる場合、すべてのリストを再びロードするのではなく、それを行う価値があるかもしれません。いずれにせよ、値にインデックスや制約のようなものを入れないでください。また、nullを許可しないでください(可能であれば)。インデックスと制約を維持するには時間がかかり、nullを許可すると、時間がかかるか、頭上になります。 deal_idsは、主要なキーであるため、もちろんインデックス化できます(そしてそうです)。
これはそれほどではありませんが、少なくとも1つのダウンボートの答えよりも優れています:)
外部コンポーネントを追加してプログラムの実行を遅くする理由はまったくありません。データブロックを圧縮し、使用可能な内部メモリを超えるものを処理する必要がある場合は、ファイルに書き込みます。ワークステーションには192GBのRAMが必要なので、多くの時間を無駄にする余裕はありません。