Java:大型持久哈希结构?

时间:2010-09-30 16:17:36

标签: java hash persistent

我在java中寻找一个持久的哈希结构,这是一个简单的键值存储,其中key是唯一的字符串,值是int。每次将现有密钥添加到商店时,密钥的值都会递增。

我需要这个很大 - 可能是500m - 10n键。我一直在评估tokyo-cabinet http://fallabs.com/tokyocabinet/javadoc/,但不确定它的扩展程度 - 随着哈希的增长,插入时间似乎越来越长。

关于什么可能合适的想法?

由于

编辑:为了减少磁盘I / O,我将在内存中的HashMap中缓存数据,然后在缓存增长到某个时候一次性更新持久性哈希大小

Edit2:持久性的一个原因是我的内存有限,4GB,所以我无法在内存中加入大量的结构。

5 个答案:

答案 0 :(得分:5)

我认为Megamap正是您所寻找的:http://megamap.sourceforge.net/。以下是Megamap的主页简介:

  

MegaMap是一个Java的实现   可以存储的map(或哈希表)   无限量的数据,仅限于此   按可用磁盘空间量。   存储在地图中的对象是   坚持到磁盘。表现不错   通过内存缓存实现。该   对于所有实用的MegaMap都可以   原因,被认为是一张地图   实现无限存储   空间。

答案 1 :(得分:2)

使用数据库而不是哈希。即使对于数据库而言,500M行也变得非常大。您希望每秒有多少更新?

答案 2 :(得分:2)

你看过Berkeley BD Java版吗?他们有一个Collections-compatible API(另见StoredMap的Javadoc)。

答案 3 :(得分:0)

因此,如果我理解正确,Redis可能是一个选项。您可以发出INCR [key]命令以原子方式递增与该键关联的值。如果密钥不存在,则将其设置为零然后递增(导致一个)。根据{{​​3}},INCR是一个固定时间操作。速度是Redis的主要设计目标。

Redis能够将自己保存到文件中,您可以控制这些参数的参数。

答案 4 :(得分:0)

我认为Memcached对于您的案例以及后端合适的数据库都是不错的选择。