我需要一个磁盘备份地图结构在Java应用程序中使用。 它必须具备以下条件:
- 能够存储数百万条记录(甚至数十亿)的
- 快速查找 - 在地图上的大多数操作只会看是否有键已经存在。 此,与上述1是最重要的标准。 应该有一个有效的内存缓存机制经常使用的按键。
- 持久性,但并不需要是事务性的,可以与一些失败共存。 即高兴能与磁盘同步周期性,并且不需要是事务性的。
- 能够存储简单的原始类型的 - 但我并不需要存储序列化对象。
- 它并不需要分发,即会在一个机器上运行的所有。
- 易于设置和免费使用。
- 无需关系查询
记录键将字符串或多头。 如上所述读取会比写更频繁,并且大部分的读取将仅仅是检查是否有键存在(即不需要读取密钥相关数据)。 每个记录将被更新一次,只和记录不会被删除。
我目前使用BDB JE但正在寻求其它选项。
更新
因为通过减少在第二个键的依赖在我现有的BDB设置提高查询性能都有。 需要某些查询的两个辅助键联接,并通过它们合并为一个复合键,我删除间接其中很好地加快东西查找的水平。
我可能会使用一个本地数据库。 好比说BDB JE或HSQLDB 。 请问什么是错的这种做法? 你必须有一些理由来寻找替代品。
在回应评论:由于业绩方面的问题,我想你已经在使用JDBC来处理这可能是值得尝试HSQLB和阅读的章节内存和磁盘使用 。
JDBM3不正是你所期待的。 这是非常简单的API和高性能磁盘备份映射库。
UPDATE
该项目现在已经演变成创建mapdb http://www.mapdb.org
您可以从尝试的Java编年史http://openhft.net/products/chronicle-map/纪事地图是一款高性能,离堆,键值,在内存中,坚持数据存储。 它像一个标准的Java地图
截至今天我要么使用创建mapdb (基于文件/支持同步或异步)或Hazelcast 。 在以后你将必须实现您通过实现Java接口由RDBMS支持自己的持久性,即。 OpenHFT纪事可能是一个其他的选择。 我不知道持续性是如何工作的有,因为我从来没有使用过它,但要求有一个。 OpenHFT是完全脱落堆,并允许(原语)对象的部分更新,而不(缩小)序列,这可能是一个性能优势。
注:如果您需要地图基于磁盘的,因为内存问题最简单的选择是创建mapdb。 Hazelcast可以用作高速缓存(分布式或不),它允许你驱逐时间或大小后从堆元件。 OpenHFT是堆外,并可以考虑,如果你只需要重启而持续性。
我发现东京内阁是一个简单的保持哈希/地图,和快速设置和使用。
这个缩写示例,取自该文档 ,表明它是多么简单的一个持久的地图保存和检索数据:
// 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();
SQLite的做到这一点。 我写了一个包装,使用它与Java: http://zentus.com/sqlitejdbc
正如我在评论中提到,我已经成功地使用的SQLite与数亿行的千兆字节的数据和表格。 如果你想出来的索引得当,它的速度非常快。
唯一痛苦的是JDBC接口。 相比于简单的HashMap,它是笨重。 我经常写出来一个JDBC-包装的具体项目,这最多可以添加大量的样板代码。
JBoss的(树)缓存是一个很好的选择。 你可以用它从JBoss的独立的。 非常强大的,高性能,灵活。