Javaはありますか(または使用可能なライブラリがあります)、ディスクベースのHashMapを使用できますか?アトミックまたは何かである必要はありませんが、複数のスレッドを介してアクセスされます。 2つが同じ要素に同時にアクセスしている場合でもクラッシュしません。
誰か知ってる?
プロパティファイル または Berkeley DB のどちらかを探している可能性があります。 Java.util.Properties
自体はJava.util.Map
を実装し、load
からstore
へのメソッドをファイルに提供します。 Berkeley DBは、軽量のキーと値のペアのデータストアとして推奨されることがよくあります。
MapDB
MapDBは、ディスクストレージまたはオフヒープメモリによってサポートされるTreeMapとHashMapを同時に提供します。これは、高速でスケーラブルで使いやすい埋め込み型のJavaデータベースエンジンです。トランザクション、スペース効率の高いシリアル化、インスタンスキャッシュ、透過的な圧縮/暗号化などの機能が満載です。優れたパフォーマンスも備えています。ネイティブの組み込みdbエンジンだけに匹敵します。
jdbm2
埋め込みキー値Javaデータベース。
軽量のdbに近いものが必要なようです。見て/考慮したことがあります Java DB? 単一のインデックス付きテーブルを持つ軽いデータベースは、基本的にディスクベースのスレッドセーフなハッシュマップです。
JDBM2 はまさにあなたが求めているものです。 (他のマップの中でも)ディスクストレージによってバックアップされたHashMapを提供します。高速でスレッドセーフで、APIは非常にシンプルです。
Chronicle Map はConcurrentMap
を実装し、メモリをマップしてデータをディスクに永続化しますファイル。
Chronicle Mapは概念的にMapDBに非常に似ています(同様のビルダーAPIとMap
インターフェースを提供します)が、Chronicle MapはMapDBより 倍高速 であり、同時実行性がはるかに優れています(Chronicleマップは高度にストライプ化されたマルチレベルスピンロックを使用します)。
Project Voldemort も非常に高速/スケーラブル/レプリケーションの「ハッシュマップ」です。 LinkedInで使用され、パフォーマンスもかなり良好です。
彼らのサイトからの引用:
これは、パフォーマンスラボで人為的に高負荷がかかっている状態で「ホット」データセットがメモリ内にある単一のサーバーと通信する単一のマルチスレッドクライアントから見たスループットです。
読み取り:19,384リクエスト/秒
書き込み:16,559リクエスト/秒
2018
最も軽い永続的なkey value
ストアは MVStoreを含むH2データベース :
MVStoreは、永続的なログ構造のKey-Valueストアです。 H2の次のストレージサブシステムになる予定ですが、JDBCやSQLを使用せずに、アプリケーション内で直接使用することもできます。
MVStoreは「マルチバージョンストア」の略です。
各ストアには、Java.util.Mapインターフェースを使用してアクセスできる多数のマップが含まれています。
ファイルベースの永続性とメモリ内操作の両方がサポートされています。
高速で、使いやすく、小さいことを目的としています。
読み取りと書き込みの同時操作がサポートされています。
トランザクションがサポートされています(同時トランザクションと2フェーズコミットを含む)。
ツールは非常にモジュール化されています。プラグ可能なデータ型とシリアル化、プラグ可能なストレージ(ファイルへ、オフヒープメモリへ)、プラグ可能なマップ実装(Bツリー、Rツリー、現在の同時Bツリー)、BLOBストレージ、およびファイルシステムの抽象化をサポートします。暗号化されたファイルとZipファイルをサポートします。
h2-mvstore には依存関係がなく、バージョン1.4.200は .3 Mb の単一のjarです
私も見ました:
そして、今年は2016年です。そして、この問題に取り組むために誰かが探しているなら、JetBrainsの Xodus の低レベル環境APIがcomputeInTransaction
を使用してこれと同じ目的で機能することがわかりましたラムダを保存します。
確かに、純粋なMap
インスタンスを使用するほど洗練されたものではありませんが、私のユースケースではうまくいきました。
最近の別のオプションは H2のMVStore
ストレージエンジン を使用することですが、これは同じことを行いますが、データベース自体に合わせて調整されていると思います。
乾杯!