38

Java 是否有(或是否有可用的库)允许我拥有基于磁盘的 HashMap?它不需要是原子的或任何东西,但它将通过多个线程访问,并且如果两个线程同时访问同一个元素,则不应崩溃。

有人知道吗?

4

8 回答 8

33

地图数据库

MapDB 提供由磁盘存储或堆外内存支持的并发 TreeMap 和 HashMap。它是一个快速、可扩展且易于使用的嵌入式 Java 数据库引擎。它包含事务、空间高效序列化、实例缓存和透明压缩/加密等功能。它还具有只有本地嵌入式数据库引擎才能匹敌的出色性能。

http://www.mapdb.org/

jdbm2

嵌入式键值 Java 数据库。

https://code.google.com/p/jdbm2/

于 2013-03-07T11:01:50.557 回答
11

属性文件Berkeley DB可能是您正在寻找的。它java.util.Properties本身实现java.util.Map并提供loadstore文件到文件的方法。Berkeley DB 通常被推荐为轻量级的键值对数据存储。

于 2010-04-16T16:57:59.823 回答
10

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

我还看了:

  • MapDB13 meg依赖项)
  • 编年史地图5.5 meg依赖项 - 快速可选分布)
  • lmdbjava2 megjava 依赖项 + lmdbC 库)- 最快的实现,但不是thread safe开箱即用的。
于 2018-06-21T09:04:03.147 回答
7

听起来你需要一些接近轻量级数据库的东西。您是否看过/考虑过Java DB?具有单个索引表的轻型数据库基本上是基于磁盘的、线程安全的哈希映射。

于 2010-04-16T16:49:17.693 回答
7

JDBM2正是您要问的。它提供了一个由磁盘存储(以及其他映射)备份的 HashMap。它快速、线程安全且 API 非常简单。

于 2012-02-23T14:22:43.243 回答
6

Chronicle MapConcurrentMap通过将其内存映射到文件来实现

Chronicle Map 在概念上与 MapDB 非常相似(提供类似的构建器 API 和Map接口),但 Chronicle Map比 MapDB几倍,并且具有更好的并发性(Chronicle Map 使用高度条带化的多级自旋锁)。

于 2017-03-19T00:06:17.740 回答
4

Project Voldemort也是一个非常快速/可扩展/复制的“Hashmap”。它在 LinkedIn 上使用,性能也相当不错:

他们网站的引述:

这是我们从单个多线程客户端与单个服务器通信时看到的吞吐量,其中“热”数据集在我们的性能实验室中人为重负载的内存中:

读取:19,384 请求/秒
写入:16,559 请求/秒

于 2010-04-16T19:04:22.377 回答
2

所以现在是 2016 年。如果有人想解决这个问题,我发现 JetBrains 的Xodus中的低级环境 API使用他们的computeInTransactionstore lambdas可以达到同样的目的。

当然,它不像拥有一个纯Map实例那样光滑,但它适用于我的用例。

最近的另一个选择是使用H2 的MVStore存储引擎,它做同样的事情,但我认为它更适合数据库本身。

干杯!

于 2016-10-11T20:53:27.080 回答