28

Javaアプリで使用するには、ディスクでバックアップされたMap構造が必要です。次の基準が必要です。

  1. 数百万(数十億)のレコードを保存できます
  2. 高速ルックアップ-マップでの操作の大部分は、キーがすでに存在するかどうかを確認するだけです。これと上記の1つが最も重要な基準です。頻繁に使用されるキーのメモリキャッシュメカニズムには効果的なものが必要です。
  3. 永続的ですが、トランザクションである必要はありませんが、何らかの障害が発生する可能性があります。つまり、定期的にディスクと同期でき、トランザクションである必要はありません。
  4. 単純なプリミティブ型を格納できますが、シリアル化されたオブジェクトを格納する必要はありません。
  5. 配布する必要はありません。つまり、すべてを1台のマシンで実行します。
  6. セットアップが簡単で、無料で使用できます。
  7. リレーショナルクエリは必要ありません

レコードキーは文字列またはlongになります。上記のように、読み取りは書き込みよりもはるかに頻繁に行われ、読み取りの大部分は単にキーが存在するかどうかを確認することです(つまり、キーに関連付けられたデータを読み取る必要はありません)。各レコードは1回だけ更新され、レコードは削除されません。

私は現在BdbJEを使用していますが、他のオプションを探しています。


アップデート

その後、セカンダリキーへの依存を減らすことで、既存のBDBセットアップでのクエリパフォーマンスが向上しました。一部のクエリでは、2つのセカンダリキーを結合する必要があり、それらを複合キーに結合することで、ルックアップの間接参照のレベルを削除しました。これにより、処理が大幅に高速化されます。

4

9 に答える 9

20

JDBM3は、まさにあなたが探していることを実行します。これは、非常にシンプルなAPIと高性能を備えたディスクバックアップマップのライブラリです。

アップデート

このプロジェクトは現在、MapDBhttp ://www.mapdb.orgに進化しています。

于 2012-02-23T14:30:38.887 に答える
6

OrientDBを調べてみてください。

于 2010-06-12T09:54:16.033 に答える
6

http://openhft.net/products/chronicle-map/からJavaChroniclesを試すことができます。ChronicleMap は、高性能、オフヒープ、キー値、メモリ内、永続化されたデータストアです。標準のJavaマップのように機能します

于 2014-11-24T15:22:29.223 に答える
3

私はおそらくローカルデータベースを使用するでしょう。BdbJEやHSQLDBのように。このアプローチの何が問題になっていますか?代替案を探す理由が必要です。

コメントへの応答:問題のパフォーマンスとして、これを処理するためにすでにJDBCを使用していると思いますが、HSQLBを試して、メモリとディスクの使用に関する章を読む価値があるかもしれません。

于 2009-10-08T10:35:28.030 に答える
3

今日の時点で、私はMapDB(ファイルベース/バックアップ同期または非同期)またはHazelcastのいずれかを使用します。後で、Javaインターフェースを実装することにより、RDBMSに裏打ちされた独自の永続性を実装する必要があります。OpenHFTクロニクルは他のオプションかもしれません。私はそれを使用したことがないので、そこで永続性がどのように機能するかはわかりませんが、永続性があると主張しています。OpenHFTは完全にオフヒープであり、(逆)シリアル化なしで(プリミティブの)オブジェクトの部分的な更新を可能にします。これはパフォーマンス上の利点になる可能性があります。

注:メモリの問題のためにマップディスクベースが必要な場合、最も簡単なオプションはMapDBです。Hazelcastは、時間またはサイズの後に要素をヒープから削除できるようにするキャッシュ(分散されているかどうかに関係なく)として使用できます。OpenHFTはオフヒープであり、jvmの再起動にのみ永続性が必要な場合に検討できます。

于 2017-03-12T17:38:24.527 に答える
1

SQLiteはこれを行います。Javaから使用するためのラッパーを作成しました:http://zentus.com/sqlitejdbc

コメントで述べたように、私はギガバイトのデータと数億行のテーブルでSQLiteをうまく使用しました。インデックス作成を適切に考えれば、非常に高速です。

唯一の問題はJDBCインターフェースです。単純なHashMapと比較すると、不格好です。私はしばしば、特定のプロジェクト用にJDBCラッパーを作成することになります。これにより、多くの定型コードが追加される可能性があります。

于 2009-10-08T11:03:23.607 に答える
1

東京キャビネットは、シンプルで永続的なハッシュ/マップであり、セットアップと使用が高速であることがわかりました。

ドキュメントから抜粋したこの簡略化された例は、永続的なマップからデータを保存および取得することがいかに簡単であるかを示しています。

    // create the object
    HDB hdb = new HDB();
    // open the database
    hdb.open("casket.tch", HDB.OWRITER | HDB.OCREAT);
    // add item 
    hdb.put("foo", "hop");
    hdb.close();
于 2010-09-27T12:21:48.567 に答える
0

HibernateShardsはすべての要件を簡単に満たすことができると思います。

于 2009-10-08T10:37:29.217 に答える
0

JBoss(ツリー)キャッシュは素晴らしいオプションです。JBossからスタンドアロンで使用できます。非常に堅牢で、パフォーマンスが高く、柔軟性があります。

于 2009-10-08T15:26:02.897 に答える