推荐一个快速和可扩展的持久地图 - Java的(Recommend a fast & scalab

2019-07-21 10:30发布

我需要一个磁盘备份地图结构在Java应用程序中使用。 它必须具备以下条件:

  1. 能够存储数百万条记录(甚至数十亿)的
  2. 快速查找 - 在地图上的大多数操作只会看是否有键已经存在。 此,与上述1是最重要的标准。 应该有一个有效的内存缓存机制经常使用的按键。
  3. 持久性,但并不需要是事务性的,可以与一些失败共存。 即高兴能与磁盘同步周期性,并且不需要是事务性的。
  4. 能够存储简单的原始类型的 - 但我并不需要存储序列化对象。
  5. 它并不需要分发,即会在一个机器上运行的所有。
  6. 易于设置和免费使用。
  7. 无需关系查询

记录键将字符串或多头。 如上所述读取会比写更频繁,并且大部分的读取将仅仅是检查是否有键存在(即不需要读取密钥相关数据)。 每个记录将被更新一次,只和记录不会被删除。

我目前使用BDB JE但正在寻求其它选项。


更新

因为通过减少在第二个键的依赖在我现有的BDB设置提高查询性能都有。 需要某些查询的两个辅助键联接,并通过它们合并为一个复合键,我删除间接其中很好地加快东西查找的水平。

Answer 1:

我可能会使用一个本地数据库。 好比说BDB JE或HSQLDB 。 请问什么是错的这种做法? 你必须有一些理由来寻找替代品。

在回应评论:由于业绩方面的问题,我想你已经在使用JDBC来处理这可能是值得尝试HSQLB和阅读的章节内存和磁盘使用 。



Answer 2:

JDBM3不正是你所期待的。 这是非常简单的API和高性能磁盘备份映射库。

UPDATE

该项目现在已经演变成创建mapdb http://www.mapdb.org



Answer 3:

你可能想看看OrientDB 。



Answer 4:

您可以从尝试的Java编年史http://openhft.net/products/chronicle-map/纪事地图是一款高性能,离堆,键值,在内存中,坚持数据存储。 它像一个标准的Java地图



Answer 5:

截至今天我要么使用创建mapdb (基于文件/支持同步或异步)或Hazelcast 。 在以后你将必须实现您通过实现Java接口由RDBMS支持自己的持久性,即。 OpenHFT纪事可能是一个其他的选择。 我不知道持续性是如何工作的有,因为我从来没有使用过它,但要求有一个。 OpenHFT是完全脱落堆,并允许(原语)对象的部分更新,而不(缩小)序列,这可能是一个性能优势。

注:如果您需要地图基于磁盘的,因为内存问题最简单的选择是创建mapdb。 Hazelcast可以用作高速缓存(分布式或不),它允许你驱逐时间或大小后从堆元件。 OpenHFT是堆外,并可以考虑,如果你只需要重启而持续性。



Answer 6:

我发现东京内阁是一个简单的保持哈希/地图,和快速设置和使用。

这个缩写示例,取自该文档 ,表明它是多么简单的一个持久的地图保存和检索数据:

    // create the object
    HDB hdb = new HDB();
    // open the database
    hdb.open("casket.tch", HDB.OWRITER | HDB.OCREAT);
    // add item 
    hdb.put("foo", "hop");
    hdb.close();


Answer 7:

SQLite的做到这一点。 我写了一个包装,使用它与Java: http://zentus.com/sqlitejdbc

正如我在评论中提到,我已经成功地使用的SQLite与数亿行的千兆字节的数据和表格。 如果你想出来的索引得当,它的速度非常快。

唯一痛苦的是JDBC接口。 相比于简单的HashMap,它是笨重。 我经常写出来一个JDBC-包装的具体项目,这最多可以添加大量的样板代码。



Answer 8:

JBoss的(树)缓存是一个很好的选择。 你可以用它从JBoss的独立的。 非常强大的,高性能,灵活。



Answer 9:

我觉得休眠碎片可以轻松满足您的所有需求。



文章来源: Recommend a fast & scalable persistent Map - Java