Java 字节数组值的内存有效映射

Java 字节数组值的内存有效映射,java,dictionary,hashmap,Java,Dictionary,Hashmap,我试图将大量数据加载到HashMap中。目前,我正在努力推动2000万条参赛作品。当将这么多的条目加载到此映射中时,我注意到,考虑到我加载到此映射中的所有内容都是字节数组(我从500mb文件生成此数据,每个字节数组的平均大小为5,最多为11): Map结果=新的HashMap(entryCount,1); for(int i=0;i

我试图将大量数据加载到
HashMap
中。目前,我正在努力推动2000万条参赛作品。当将这么多的条目加载到此映射中时,我注意到,考虑到我加载到此映射中的所有内容都是字节数组(我从500mb文件生成此数据,每个字节数组的平均大小为5,最多为11):

Map结果=新的HashMap(entryCount,1);
for(int i=0;i
类:

公共最终类密钥{
私有最终字节[]值;
键(字节[]值){
这个值=值;
}
//等于,哈希代码,toString
}
使用
jProfiler
查找消耗这么多内存的内容时,我注意到
HashMap$Node
是图表顶部的类之一:


我很好奇,对于这种确切的数据类型,是否有更高效的
Map
实现?

您可以使用特定于类型的Map,如在fastutil或trove等中。例如,您可以在fastutil中使用Object2ByteArrayMap,以满足您的需求


您正在使用26兆存储20兆。。。在那张
地图中有~100k个数组吗?@ElliottFrisch我存储了2000万个数组。我想知道的是,是否存在不为每个map元素创建
节点的map实现。对于我存储的这种特定类型的数据,可能有专门的映射实现。类
Key
有一个实例变量
byte[]value
结果
映射的值类型也是
字节[]
。您是否将键的值放入映射中:
result.put(k,k.getValue())
?这是多余的。映射是不必要的,因为您需要知道键
k
才能从映射中获取值:
result.get(k)
。但是如果您有键
k
,那么您就有了它的值:
k.getValue()
。那么就不需要地图了。@LuCio
key
和我在地图中输入的值是完全不相关的。该键实际上是一个
md5
散列。而该值由从文件中读取的字节组成。
Object2ByteArrayMap
仅在内部使用字节数组,并且只允许每个键存储1个字节(不是数组)。另外,在阅读时,似乎此数据结构是为少量条目构建的。@Edd是的,您是对的。您是否尝试过
Object2ObjectMap
?或者你可以定制你自己的地图。是的,我做了。它有几千条参赛作品,所以我勉强记下了这个想法。