推荐用于 Java 实现的低内存 hashmap
Posted
技术标签:
【中文标题】推荐用于 Java 实现的低内存 hashmap【英文标题】:Recommended low memory hashmap for implementation for Java 【发布时间】:2011-01-24 00:08:39 【问题描述】:我目前正在处理一个与编程相关的问题,我试图制作大量的数据哈希图。数据的键是 CharSequence 的自定义低内存实现,它实现了 hashCode() 和 equals(...),值是一个整数对象。
这个哈希表中可能有数百万个条目,我设法通过让 Integer 成为文件中指向我希望哈希的数据的指针来大大减少该值的内存使用,但问题是密钥可能是几十个字节数(平均 25 个字节),并且在 HashMap 的默认实现中需要将键保存在内存中。
我需要一个具有低内存开销并且可以将键分页到磁盘或存储键的散列表示的哈希图。如果键本身是散列的,那么我会担心散列冲突。
理想情况下,我希望能够在映射中每 50MB 的堆空间存储一百万个条目(键中为 25 字节的一个字节数组,值部分中为整数对象)。
是否有人对低内存文件系统支持的 Maps 有任何经验,这些 Maps 已针对减少键的占用空间进行了优化?
谢谢,
克里斯
【问题讨论】:
空间和时间往往是权衡关系。您对添加、搜索、删除节点的性能/可扩展性要求是什么?如果你只想要低内存,你可以使用数组。 听起来你想要一个内存数据库? 【参考方案1】:您可以使用 Java 的哈希映射并编写一个 FileKey 类,该类接受一个 RandomAccessFile、偏移量和长度,在构造时预先计算哈希,并通过读取文件中的数据来实现 Comparable。
结合简单的 MRU 缓存,您可以使用另一个以相同键为键的 hashmap 在内存中保留一些键,但它使用自定义比较器,该比较器仅比较偏移量和长度值(而不是文件数据)。
【讨论】:
【参考方案2】:Berkeley DB Java Edition 怎么样?它的StoredMap 类看起来就像您要找的一样。
【讨论】:
【参考方案3】:我认为默认的HashSet
不是一个糟糕的方法——自己制作键值对(所以你不必将它们包装在额外的对象中)。这种方式非常节省内存;它实际上只需要大约 (1/loadFactor)^(3/2)*4 字节的关键对象顶部的内存 + 4 字节的值。在实践中,这应该会增加每个条目 8 字节的开销。 (如果您事先知道要存储多少个密钥,则可以进一步减少。)
【讨论】:
以上是关于推荐用于 Java 实现的低内存 hashmap的主要内容,如果未能解决你的问题,请参考以下文章