高速でスケーラブルな永続的なマップ-Javaをお勧めします
-
20-09-2019 - |
質問
Javaアプリで使用するには、ディスクバックされたマップ構造が必要です。次の基準が必要です。
- 数百万の記録を保存することができます(数十億)
- 高速検索 - マップ上の操作の大部分は、キーがすでに存在するかどうかを確認するだけです。これと1つは最も重要な基準です。頻繁に使用されるキーのメモリキャッシュメカニズムが効果的である必要があります。
- 永続的ですが、トランザクションである必要はありませんが、ある程度の失敗とともに生きることができます。つまり、定期的にディスクと同期して喜んでいて、トランザクションである必要はありません。
- シンプルなプリミティブタイプを保存できますが、シリアル化されたオブジェクトを保存する必要はありません。
- 配布する必要はありません。つまり、1つのマシンですべて実行されます。
- セットアップが簡単で、無料で使用できます。
- リレーショナルクエリは必要ありません
レコードキーは文字列またはロングになります。上記のように、読み取りは書き込みよりもはるかに頻繁に行われ、読み取りの大部分は単にキーが存在するかどうかを確認するだけです(つまり、関連するデータを読み取る必要はありません)。各レコードは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の再起動にのみ持続性が必要な場合に考慮することができます。
sqliteはこれを行います。 Javaから使用するラッパーを書きました: http://zentus.com/sqlitejdbc
コメントで述べたように、ギガバイトのデータと数億列の表を備えたSQLiteを使用しました。インデックスを適切に考えると、非常に速いです。
唯一の痛みはJDBCインターフェイスです。単純なハッシュマップと比較して、それは不格好です。私はしばしば、特定のプロジェクトのためにJDBC-Wrapperを書くことになります。
jboss(ツリー)キャッシュ 素晴らしいオプションです。 JBossのスタンドアロンを使用できます。非常に堅牢で、パフォーマンスがあり、柔軟です。
おもう 休止状態の破片 すべての要件を簡単に満たすことができます。