Java 是否有(或是否有可用的库)允许我拥有基于磁盘的 HashMap?它不需要是原子的或任何东西,但它将通过多个线程访问,并且如果两个线程同时访问同一个元素,则不应崩溃。
有人知道吗?
Java 是否有(或是否有可用的库)允许我拥有基于磁盘的 HashMap?它不需要是原子的或任何东西,但它将通过多个线程访问,并且如果两个线程同时访问同一个元素,则不应崩溃。
有人知道吗?
地图数据库
MapDB 提供由磁盘存储或堆外内存支持的并发 TreeMap 和 HashMap。它是一个快速、可扩展且易于使用的嵌入式 Java 数据库引擎。它包含事务、空间高效序列化、实例缓存和透明压缩/加密等功能。它还具有只有本地嵌入式数据库引擎才能匹敌的出色性能。
jdbm2
嵌入式键值 Java 数据库。
属性文件或Berkeley DB可能是您正在寻找的。它java.util.Properties
本身实现java.util.Map
并提供load
从store
文件到文件的方法。Berkeley DB 通常被推荐为轻量级的键值对数据存储。
在2018
最轻量级的持久key value
存储中是H2 数据库及其 MVStore:
MVStore 是一个持久的、日志结构的键值存储。它计划成为 H2 的下一个存储子系统,但它也可以直接在应用程序中使用,无需使用 JDBC 或 SQL。
MVStore 代表“多版本存储”。
每个商店都包含许多可以使用 java.util.Map 接口访问的地图。
支持基于文件的持久性和内存操作。
它旨在快速、易于使用且体积小。
支持并发读写操作。
支持事务(包括并发事务和两阶段提交)。
该工具非常模块化。它支持可插入数据类型和序列化、可插入存储(到文件、到堆外内存)、可插入映射实现(目前是 B-tree、R-tree、并发 B-tree)、BLOB 存储和文件系统抽象支持加密文件和压缩文件。
h2-mvstore没有依赖项,版本 1.4.200 是一个0.3 Mb的 jar
我还看了:
听起来你需要一些接近轻量级数据库的东西。您是否看过/考虑过Java DB?具有单个索引表的轻型数据库基本上是基于磁盘的、线程安全的哈希映射。
JDBM2正是您要问的。它提供了一个由磁盘存储(以及其他映射)备份的 HashMap。它快速、线程安全且 API 非常简单。
Chronicle MapConcurrentMap
通过将其内存映射到文件来实现
Chronicle Map 在概念上与 MapDB 非常相似(提供类似的构建器 API 和Map
接口),但 Chronicle Map比 MapDB快几倍,并且具有更好的并发性(Chronicle Map 使用高度条带化的多级自旋锁)。
Project Voldemort也是一个非常快速/可扩展/复制的“Hashmap”。它在 LinkedIn 上使用,性能也相当不错:
他们网站的引述:
这是我们从单个多线程客户端与单个服务器通信时看到的吞吐量,其中“热”数据集在我们的性能实验室中人为重负载的内存中:
读取:19,384 请求/秒
写入:16,559 请求/秒
所以现在是 2016 年。如果有人想解决这个问题,我发现 JetBrains 的Xodus中的低级环境 API使用他们的computeInTransaction
store lambdas可以达到同样的目的。
当然,它不像拥有一个纯Map
实例那样光滑,但它适用于我的用例。
最近的另一个选择是使用H2 的MVStore
存储引擎,它做同样的事情,但我认为它更适合数据库本身。
干杯!