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

  1. 能够存储数百万记录(甚至数十亿)
  2. 快速查找 - 地图上的大多数操作将简单地查看是否已经存在。这是最重要的标准。对于经常使用的密钥,应该有有效的内存缓存机制。
  3. 持久,但不需要交易,可能会失败。 IE很乐意定期与磁盘同步,并且不需要交易。
  4. 能够存储简单的原始类型 - 但我不需要存储串行的对象。
  5. 它不需要分发,即将全部运行在一台计算机上。
  6. 易于设置并免费使用。
  7. 无需关系查询

记录键将是字符串或隆起。如上所述,读取将比写入要频繁得多,大多数读取将仅仅是检查是否存在密钥(即无需读取关联的键数据)。每个记录将仅更新一次,并且未删除记录。

我目前使用BDB JE,但正在寻找其他选择。


更新

从那以后,通过减少对辅助键的依赖性来提高我现有的BDB设置的查询性能。一些查询需要在两个辅助键上加入,然后将它们组合成一个复合键,我在查找中删除了一定程度的间接键,从而加快了速度。

有帮助吗?

解决方案

我可能会使用本地数据库。就像说 BDB JE 或者 HSQLDB. 。请问这种方法有什么问题?您必须有一些理由寻找替代方案。

回答评论:由于问题的表现,我想您已经在使用JDBC来处理此问题,可能值得尝试HSQLB并阅读有关 内存和磁盘使用.

其他提示

JDBM3 确切地做您要寻找的事情。这是一个非常简单的API和高性能的磁盘支持的地图库。

更新

该项目现已演变为MAPDB http://www.mapdb.org

您可能想调查 OrientDB.

您可以尝试使用Java Chronicles http://openhft.net/products/chronicle-map/纪事地图是一张高性能,外部,钥匙值,在内存中,持续存在的数据存储。它像标准Java地图一样工作

截至今天,我要么使用 MAPDB (基于文件/支持的同步或异步)或 榛子. 。稍后,您将必须实现自己的持久性,即通过实现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

正如我在评论中提到的那样,我成功地使用了千兆字节的数据和数亿行的表格。如果您正确考虑索引,那就很快了。

唯一的痛苦是JDBC界面。与简单的哈希图相比,它很笨拙。我通常最终为特定项目编写JDBC-Wrapper,这可能加起来很多样板代码。

jboss(树)缓存 是一个不错的选择。您可以从JBOSS独立使用它。非常健壮,表现和灵活。

我认为 冬眠碎片 可以轻松满足您的所有要求。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top