推荐用于Java实现的低内存hashmap

时间:2010-03-05 06:30:29

标签: java performance collections hashtable hashmap

我目前正在研究编程相关的问题,我试图制作一个庞大的数据散列图。数据的关键是CharSequence的自定义低内存实现,它实现hashCode()和equals(...),值为是Integer对象。

这个散列表中可能有数百万个条目,我通过将Integer作为文件中的指针指向我想要散列的数据,但是设法大大减少了值的内存使用但问题是密钥可能是数十字节数(平均25个字节)以及密钥需要在HashMap的默认实现中保存在内存中。

我需要一个内存开销较低的hashmap,它可能会将密钥分页到磁盘,或者存储密钥的散列表示。如果密钥本身是哈希值,那么我会担心哈希冲突。

理想情况下,我希望每50MB堆空间能够在地图中存储一百万个条目(密钥中的一个字节数组为25个字节,值部分中为Integer对象)。

是否有人对低内存文件系统支持的地图有经验,这些地图经过优化可以减少密钥的占用空间?

谢谢,

克里斯

3 个答案:

答案 0 :(得分:3)

您可以使用Java的哈希映射并编写一个FileKey类,该类采用RandomAccessFile,offset和length,在构造时预先计算哈希值,并通过从文件中读取数据来实现Comparable,仅用于比较。

结合一个简单的MRU缓存,你可以使用另一个键控在同一个键上的hashmap在内存中保留一些键,但是它使用自定义比较器来比较偏移量和长度值(而不是文件数据) )。

答案 1 :(得分:2)

Berkeley DB Java Edition怎么样?它的StoredMap类看起来就像你要找的那样。

答案 2 :(得分:1)

我认为默认的HashSet并不是一个糟糕的方法 - 自己制作键值对(所以你不必将它们包装在一个额外的对象中)。这样的内存效率非常高;它实际上只需要大约(1 / loadFactor)^(3/2)* 4字节更多的内存在你的密钥对象上+ 4个字节的值。实际上,这应该为每个条目添加8字节的开销。 (如果您事先知道要存储的密钥数量,可以进一步减少这种情况。)