推荐快速且可扩展的持久性Map - Java

Joe*_*oel 26 java berkeley-db map persistent berkeley-db-je

我需要一个磁盘支持的Map结构才能在Java应用程序中使用.它必须具有以下标准:

  1. 能够存储数百万条记录(甚至数十亿条记录)
  2. 快速查找 - Map上的大多数操作只是查看密钥是否已存在.这和上面的1是最重要的标准.对于经常使用的密钥,应该有一个有效的内存缓存机制.
  3. 持久的,但不需要是事务性的,可以忍受一些失败.即乐意定期与磁盘同步,并且不需要是事务性的.
  4. 能够存储简单的基本类型 - 但我不需要存储序列化对象.
  5. 它不需要分发,即将在一台机器上运行.
  6. 设置简单,免费使用.
  7. 无需关系查询

记录键将是字符串或长整数.如上所述,读取将比写入更频繁,并且大多数读取将仅仅是检查密钥是否存在(即,不需要读取密钥相关数据).每条记录仅更新一次,记录不会被删除.

我目前使用Bdb JE但我正在寻找其他选择.


更新

从那以后,通过减少对二级密钥的依赖性,提高了现有BDB设置的查询性能.有些查询需要在两个辅助密钥上进行连接,并将它们组合成一个复合密钥,我在查找中删除了一个间接级别,这样可以很好地加快速度.

And*_*ejs 19

JDBM3完全符合您的要求.它是一个磁盘支持的映射库,具有非常简单的API和高性能.

UPDATE

该项目现已发展为MapDB http://www.mapdb.org


Juh*_*älä 6

您可能想要了解OrientDB.


Har*_*ngh 6

您可以从http://openhft.net/products/chronicle-map/尝试Java Chronicles.Chronicle Map是一个高性能的堆外键值,在内存中,持久化数据存储.它的工作方式类似于标准的Java地图

  • @krister - 我认为这是一个不太理想的问题产生违反SO政策的答案的情况(答案很好地回答了这个问题).在这种情况下,我倾向于反对这个问题. (2认同)

Mic*_*mlk 3

我可能会使用本地数据库。就像Bdb JEHSQLDB一样。请问这种做法有什么问题吗?您必须有某种理由去寻找替代方案。

回应评论:由于性能问题,我猜您已经在使用 JDBC 来处理这个问题,因此可能值得尝试 HSQLB 并阅读有关内存和磁盘使用的章节。

  • 此外,HSQLDB **不是**一个可接受的解决方案。虽然它可以在磁盘上存储大量数据,但在读取时它不会从磁盘流式传输这些数据。它将整个“ResultSet”读入内存,而不是在迭代时将其分页。如果您需要走过桌子的很大一部分,这会耗尽您的记忆力。BDB 可以很好地处理这个问题。我也相信 h2 数据库(http://www.h2database.com/html/main.html)声称可以解决这个问题,尽管我从未使用过它。 (4认同)
  • 一旦达到破坏缓存的程度,BDB 就会变慢。BDB 本质上在内存中有一个 BTree,它尝试响应请求。如果请求无法得到答复,BDB 就会从磁盘调入更多数据。一旦您的工作集大于缓存,您就会遇到麻烦。有一些 JMX 方法可用于监视缓存命中未命中和缓存大小:使用它们来调试应用程序,并在必要时增加堆并为 BDB 提供更多缓存。 (2认同)