質問

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

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

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

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


アップデート

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

役に立ちましたか?

解決

ローカルデータベースを使用する可能性があります。言うように BDB JE また HSQLDB. 。このアプローチの何が問題なのか聞いてもいいですか?代替案を探している理由が必要です。

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

他のヒント

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

アップデート

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

あなたは調べたいかもしれません OrientDB.

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

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

注:メモリの問題のためにマップディスクベースが必要な場合、最も簡単なオプションはMAPDBです。 Hazelcastは、時間またはサイズの後にヒープから要素を追い出すことができるキャッシュ(分散かどうか)として使用できます。 OpenHftは山から外れており、JVMの再起動にのみ持続性が必要な場合に考慮することができます。

私は見つけました 東京キャビネット 単純な永続的なハッシュ/マップになり、セットアップと使用を速くします。

この省略された例は、から取られています ドキュメント, 、永続的なマップからデータを保存して取得することがどれほど簡単かを示しています。

    // 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();

sqliteはこれを行います。 Javaから使用するラッパーを書きました: http://zentus.com/sqlitejdbc

コメントで述べたように、ギガバイトのデータと数億列の表を備えたSQLiteを使用しました。インデックスを適切に考えると、非常に速いです。

唯一の痛みはJDBCインターフェイスです。単純なハッシュマップと比較して、それは不格好です。私はしばしば、特定のプロジェクトのためにJDBC-Wrapperを書くことになります。

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

おもう 休止状態の破片 すべての要件を簡単に満たすことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top