【发布时间】:2015-03-31 10:30:39
【问题描述】:
我有一个处理大量数据集的程序。对象最好存储在散列实现的容器中,因为程序会一直在容器中寻找对象。
第一个想法是使用HashMap,因为这个容器的get和remove方法更适合我需要的用途。
但是,我发现 HashMap 的使用非常消耗内存,这是一个主要问题,所以我认为切换到 HashSet 会更好,因为它只使用<E>,而不是每个元素使用<K,V>,但是当我查看了我了解到它使用底层 HashMap 的实现!这意味着它不会节省任何内存!
这是我的问题:
- 我的所有假设都是真的吗?
- HashMap 内存浪费吗?更具体地说,每个条目的开销是多少?
- HashSet 和 HashMap 一样浪费吗?
-
是否还有其他基于哈希的容器会显着减少内存消耗?
更新
根据 cmets 中的要求,我将对我的程序进行一些扩展,hashMap 旨在保存一对其他对象和一些数值 - 一个从它们计算的浮点数。在此过程中,它会提取其中的一些并输入新的对。给定一对它需要确保它不持有这对或删除它。映射可以使用浮点值或pair对象的hashCode来完成。
另外,当我说“庞大的数据集”时,我指的是 ~ 4*10^9 个对象
【问题讨论】:
-
你的假设是什么?
-
这是一个主要问题:是吗?您是否测量并证明在您的用例中使用 HashSet 确实消耗了太多内存?用例是什么?
-
@almasshaikh 我的假设是我的帖子中写的所有内容,特别是接下来的问题......
-
您首先说您使用的是 HashMap 而不是使用 HashSet,尽管它们是完全不同类型的集合。我们所知道的关于您的用例(即您的应用程序必须做什么)是它必须处理“巨大的数据集”。我们不能用这么少的信息推荐任何解决方案。此外,我看到很多关于“巨大”数据集的问题,其中“巨大”实际上意味着“大约 1000 个”,这实际上很小,我更愿意问。
-
@petric,我编辑了我的answer,虽然它没有回答你所有的问题,但它包含一些提示可能有用。
标签: java memory-management hash hashmap hashset