我在java中寻找一个持久的哈希结构,这是一个简单的键值存储,其中key是唯一的字符串,值是int。每次将现有密钥添加到商店时,密钥的值都会递增。
我需要这个很大 - 可能是500m - 10n键。我一直在评估tokyo-cabinet http://fallabs.com/tokyocabinet/javadoc/,但不确定它的扩展程度 - 随着哈希的增长,插入时间似乎越来越长。
关于什么可能合适的想法?
由于
编辑:为了减少磁盘I / O,我将在内存中的HashMap中缓存数据,然后在缓存增长到某个时候一次性更新持久性哈希大小
Edit2:持久性的一个原因是我的内存有限,4GB,所以我无法在内存中加入大量的结构。
答案 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对于您的案例以及后端合适的数据库都是不错的选择。