我有一个程序正在处理巨大的数据集。对象最好存储在散列实现的容器中,因为程序不断在容器中寻找对象。
第一个想法是使用HashMap,因为这个容器的get和remove方法更适合我需要的用途。
但是,我发现 HashMap 的使用非常消耗内存,这是一个主要问题,所以我认为切换到 HashSet 会更好,因为它只使用<E>
, 并不是<K,V>
每个元素,但当我查看实现时,我了解到它使用底层 HashMap!这意味着它不会节省任何内存!
这是我的问题:
- 我所有的假设都是真的吗?
- HashMap内存浪费吗?更具体地说,每个条目的开销是多少?
- HashSet 和 HashMap 一样浪费吗?
-
是否有其他基于哈希的容器可以显着减少内存消耗?
update
按照评论中的要求,我将在我的程序上进行一些扩展,hashMap 旨在保存一对其他对象,以及一些数值(从它们计算得出的浮点数)。在此过程中,它会提取其中一些并输入新的对。给定一对,它需要确保它不持有该对或将其删除。可以使用浮点值或hashCode
对对象的。
另外,当我说“巨大的数据集”时,我指的是 ~ 4*10^9 对象
有非常有用的提示这个网站 http://java-performance.info/关于java中集合的性能。
HashSet
是建立在一个HashMap< T, Object >
,其中值为
单例“当前”对象。代表着the memory consumption of aHashSet is identical to HashMap
: 为了存储SIZE
价值观,你需要32 * 尺寸 + 4 * 容量字节(加上值的大小)。这绝对不是一个记忆友好的集合。
THashSet http://trove4j.sourceforge.net/javadocs/gnu/trove/set/hash/THashSet.html可能是最简单的替代系列HashSet
– 它实现了 Set 和 Iterable,这意味着您应该在集合的初始化中只更新一个字母。
THashSet
使用单个对象数组作为其值,因此它使用4 * 容量用于存储的字节。正如你所看到的,与 JDK HashSet 相比,你会save 32 * 尺寸在相同负载因子的情况下字节数,这是一个巨大的改进。
还有我拍摄的下面的图片here http://www.sergiy.ca/guide-to-selecting-appropriate-map-collection-in-java/可以帮助我们在选择正确的收藏时记住一些事情
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)