我需要一个磁盘支持的Map结构才能在Java应用程序中使用。它必须具有以下标准:
记录键将是字符串或长整数。如上所述,读取将比写入更频繁,并且大多数读取将仅仅是检查密钥是否存在(即,不需要读取密钥相关数据)。每条记录仅更新一次,记录不会被删除。
我目前使用的是Bdb JE,但我正在寻找其他选择。
更新
此后,通过减少对二级密钥的依赖性,提高了现有BDB设置的查询性能。有些查询需要在两个辅助密钥上进行连接,并将它们组合成一个复合密钥,我在查找中删除了一个间接级别,这样可以很好地加快速度。
答案 0 :(得分:19)
答案 1 :(得分:6)
您可能需要查看OrientDB。
答案 2 :(得分:6)
您可以从http://openhft.net/products/chronicle-map/尝试Java Chronicles Chronicle Map是一种高性能的堆外键值,在内存中,持久化数据存储。它的工作方式类似于标准的java地图
答案 3 :(得分:3)
我可能会使用本地数据库。比如说Bdb JE或HSQLDB。请问这种方法有什么问题?你必须有一些理由寻找替代方案。
回应评论: 由于问题表现而且我猜你已经在使用JDBC来处理这个问题,所以可能值得尝试HSQLB并阅读Memory and Disk Use上的章节。
答案 4 :(得分:3)
截至今天,我要使用MapDB(基于文件/支持同步或异步)或Hazelcast。在稍后,您将必须实现自己的持久性,即通过实现Java接口由RDBMS支持。 OpenHFT编年史可能是另一种选择。我不确定那里的持久性是如何起作用的,因为我从未使用它,但声称有一个。 OpenHFT完全脱离堆,允许部分更新对象(原语)而不进行(反)序列化,这可能是一种性能优势。
注意:如果由于内存问题需要基于映射磁盘,则最简单的选项是MapDB。 Hazelcast可以用作缓存(分布式或非分布式),允许您在时间或大小之后从堆中逐出元素。 OpenHFT是关闭堆的,如果你只需要jvm重启的持久性就可以考虑。
答案 5 :(得分:1)
SQLite这样做。我写了一个从Java使用它的包装器:http://zentus.com/sqlitejdbc
正如我在评论中提到的,我已成功使用带有千兆字节数据和数亿行表的SQLite。如果你正确地考虑索引,那就非常快。
唯一的痛苦是JDBC接口。与简单的HashMap相比,它很笨重。我经常最终为特定项目编写JDBC包装器,这可以添加许多样板代码。
答案 6 :(得分:1)
我发现Tokyo Cabinet是一个简单的持久性哈希/地图,并且设置和使用都很快。
这个简短的例子取自the docs,显示了从持久地图中保存和检索数据是多么简单:
// 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();
答案 7 :(得分:0)
我认为Hibernate Shards可以轻松满足您的所有要求。
答案 8 :(得分:0)
JBoss (tree) Cache是一个不错的选择。您可以从JBoss独立使用它。非常强大,高效,灵活。