7

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

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

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

谢谢

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

Edit2:持久性的原因之一是我的 RAM 有限,只有 4GB,所以我无法在内存中安装一个大结构。

4

5 回答 5

5

我认为 Megamap 是您正在寻找的东西:http: //megamap.sourceforge.net/。以下是其主页上对 Megamap 的简短描述:

MegaMap 是映射(或哈希表)的 Java 实现,它可以存储无限量的数据,仅受可用磁盘空间量的限制。存储在地图中的对象被持久化到磁盘。良好的性能是通过内存缓存实现的。出于所有实际原因,MegaMap 可以被认为是具有无限存储空间的地图实现。

于 2010-10-04T08:37:32.323 回答
2

使用数据库而不是哈希。即使对于一个数据库,500M 行也变得相当大。您希望每秒更新多少次?

于 2010-09-30T16:25:16.503 回答
2

您查看过 Berkeley BD Java 版吗?它们具有与Collections 兼容的 API(另请参见StoredMap的 Javadoc )。

于 2010-10-02T12:10:18.513 回答
0

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

Redis 能够将自己持久化到文件中,并且您可以控制参数如何发生。

于 2010-09-30T16:41:08.837 回答
0

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

于 2010-09-30T16:50:13.810 回答