1

私のアプリケーションは現在Double、計算のために何百万もの要素を保存しています。これらの値は、計算の最後に実行される特定のアルゴリズムに使用される前の一時的な値にすぎません。この計算が完了すると、何百万もの値を破棄できます。

詳細が必要な場合は、完全なストーリーがここにあります。

提案されたソリューションの 1 つは、インメモリ データベースを使用することです。

したがって、このソリューションを使用する場合、このデータベースを使用して値をテーブルに保存し、次のMap<String, List<Double>>ように current を置き換えます。

create table CALCULATION_RESULTS_XXX (
  deal_id varchar2,
  values number
);

(計算ごとに 1 つのテーブルXXX、計算 ID です)

したがって、計算中に次のことを行います。

  1. 計算が開始されたら、CALCULATION_RESULTS_XXXテーブルを作成します。
  2. 値を追加する必要があるたびに、このテーブルにレコードを挿入します。
  3. 計算の最後に、テーブルの内容をアルゴリズムに使用します。
  4. 最後に、このテーブルを削除します。

他の件名Doubleで説明したように、現在、30 * 1,000,000 のリストには約 240Mb が必要になるため、私の計算では数百 Mb のデータがメモリに格納される可能性があります。

今の質問:

  1. インメモリ データベースを使用すると、メモリの消費量は減りますか?
  2. データベースの使用(またはテーブルの作成)、データの挿入などに関して注意する必要がある特定のポイントは何ですか?
  3. H2データベースを選択すると思います。それが私のニーズに最適な選択だと思いますか?
4

4 に答える 4

2

Terracottaによってバックアップされた単純な HashMap の方がうまく機能し、JVM 仮想メモリよりも大きなコレクションを格納できます。

組み込みデータベース、特に SQL ベースのデータベースは、コードに複雑さとオーバーヘッドを追加するため、価値がありません。ランダム アクセスの永続ストレージが本当に必要な場合は、CouchDBCassandraneo4jなどの nosql DB のいずれかを試してください。

于 2010-10-14T17:59:28.540 に答える
0

プログラムの実行を遅くするために外部コンポーネントを追加する理由はまったくありません。使用可能な内部メモリよりも多くを処理する必要がある場合は、データ ブロックを圧縮してファイルに書き込みます。ワークステーションは 192 GB の RAM を必要とするため、多くの時間を無駄にする余裕はありません。

于 2011-08-28T15:58:47.707 に答える
0

問題は十分に単純なので、実際に試してみて、(パフォーマンス) 結果がどのように機能するかを確認する必要があります。

単純なメモリ内構造を使用するだけの実装が既にあります。個人的には、Dell の最も安価なコンピュータでさえ 1GB 以上の RAM を搭載していることを考えると、それを使い続けたほうがよいでしょう。それはさておき、1 つまたは 2 つのデータベースをいじるのはかなり簡単なはずです。SQLを使用する必要がなく、非常に効率的であるため、Sleepycat Berkerly DB(現在はOracleが所有しています...)を検討します。(Java はサポートしています)。

結果が有望な場合は、さらに調査を検討しますが、これには、ベンチマークを含めて、せいぜい数日しかかからないはずです。

于 2010-10-17T22:34:26.587 に答える
0

速くなるかどうかはわかりませんので、試してみる必要があります。私がお勧めしたいのは、そのリストがすぐに必要なくなったときに、リスト全体のバッチ挿入を行うことです。値ごとに値を保存しないでください:)

最終アルゴリズムを SQL で表現できる場合は、それを行う価値もあり、すべてのリストをロードし直す必要はありません。いずれにせよ、値にインデックスや制約のようなものを置かないでください。できればNULL も許可しません (可能な場合)。インデックスと制約を維持するには時間がかかります。また、NULL を許可すると、時間がかかるか、オーバーヘッドが発生する可能性があります。deal_ids は主キーであるため、もちろんインデックスを作成できます (実際にインデックスを作成できます)。

これはそれほど多くはありませんが、少なくとも反対票を投じられた単一の回答よりも優れています:)

于 2010-10-14T18:35:52.693 に答える