基于磁盘的HashMap

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

谁知道什么?

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

创建mapdb

MapDB提供由磁盘存储或堆外内存支持的并发TreeMap和HashMap。 它是一个快速,可扩展且易于使用的嵌入式Java数据库引擎。 它具有诸如事务,节省空间的序列化,实例缓存和透明压缩/加密等function。 它还具有与本机嵌入式数据库引擎相媲美的出色性能。

http://www.mapdb.org/

jdbm2

嵌入式键值Java数据库。

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

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

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

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

来自他们网站的报价:

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

读数:19,384 req / sec
写道:16,559 req / sec

Chronicle Map实现了ConcurrentMap并通过将数据映射到文件来将数据保存到磁盘。

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

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

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

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

干杯!

2018 ,最轻的持久性key value存储是H2数据库,它的MVStore :

MVStore是一个持久的,日志结构化的键值存储。 它计划成为H2的下一个存储子系统,但它也可以直接在应用程序中使用,而无需使用JDBC或SQL。

  • MVStore代表“多版本商店”。

  • 每个商店都包含许多可以使用java.util.Map界面访问的地图。

  • 支持基于文件的持久性和内存中操作。

  • 它旨在快速,简单易用,体积小。

  • 支持并发读写操作。

  • 支持事务(包括并发事务和两阶段提交)。

  • 该工具非常模块化。 它支持可插拔数据类型和序列化,可插拔存储(到文件,到堆外内存),可插拔地图实现(B树,R树,当前并发B树),BLOB存储和文件系统抽象到支持加密文件和zip文件。

H2也包含在1.8 meg的单个库中

我也看了看:

  • MapDB ( 13 meg依赖项)
  • chronicle-map ( 5.5 meg依赖项 – 快速可选分布式)
  • lmdbjava ( 2 meg java依赖项+ lmdb C库) – 最快的实现,但不是开箱即用的thread safe