内存有效的方式来处理大型HashMap

Z. *_*ton 3 java memory-management hashmap

我的项目正在处理正在写入excel文件的大量数据。我将此数据存储在一个静态HashMap中,其形式Map<List<String>, Integer>为,列表的大小仅为3。但是,Map中的条目数范围可以从0到11,300。

该项目的流程为:

  • 使用条目加载地图

  • 迭代地图并执行操作

  • 清除地图以查找下一组条目

我最近发现的有关HashMap的信息是,当违反设置的大小时,它将如何重新调整大小。因此,不仅我的地图会不断调整其大小,而且在我清除最大的一组条目时,它很可能会有大约20,000个空条目。

因此,我正在尝试对该事物进行微优化,并且在执行此操作时遇到了两难选择。我的两个想法是:

  1. 将初始HashMap的默认值设置为一个值,该值最多只能调整一次

  2. 使用每个新条目集的平均大小重新初始化HashMap,以限制重新调整大小并允许垃圾收集器进行一些清理

我的直觉告诉我,选项2可能是最合理的选择,但这仍然可以证明需要根据下一个条目集进行大量调整。但是,选项一极大地限制了一次操作的大小调整,但是实际上留下了成千上万个空条目。

我提出的两个解决方案中的一个是否比另一个更好,或者两者之间在内存改进方面没有太大区别,还是我可以监督其他解决方案(不涉及更改数据结构)?

编辑:仅在某些情况下,我想这样做,因为项目偶尔会用完堆内存,并且我试图确定此巨大映射的影响程度是多少。

EDIT2:只是为了澄清,地图本身的大小是较大的值。密钥大小(即列表)永远只有3。

dag*_*ies 6

这里的问题和已接受的回答是如此错误,以至于我不得不回答。

我的项目正在处理正在写入excel文件的大量数据。我将此数据存储在一个静态的HashMap中,其形式为Map,即Integer>,列表的大小仅为3。但是,Map中的条目数可以在0到11,300之间变化。

请不要误会我的意思,但这很小!甚至不必费心去优化这样的东西!我迅速进行了测试,将哈希表中的“ 11300”个元素填充了不到12毫秒。

我最近发现的有关HashMap的是,当设置的大小>超出时,它如何重新调整大小。因此,不仅我的地图会不断调整其大小,而且在我清除最大的一组
条目时,它可能>大约有20,000个空条目。

...只是要清楚。空条目几乎不占用空间,这些只是空指针。在64位计算机上,每个插槽8个字节,在32位计算机上,每个插槽4个字节。我们在这里最多谈论的是几千字节。

使用每个新条目集>所需的平均大小重新初始化HashMap,以限制重新调整大小并允许垃圾收集器进行一些清理。

这不是条目的平均“大小”,而是预期的条目的平均数量。

编辑:仅在某些情况下,我想这样做,因为项目偶尔会用完堆内存,并且我试图确定此巨大映射的影响程度是多少。

不可能是地图。使用探查器!您可以毫不费力地存储数百万个元素。


接受的答案不好

您可以在初始化时更改这些值,因此大小为11300,factorLoad为1,这意味着在满足您的最大值之前,地图的大小不会增加,就您而言,据我所知,它将永远不会增加。

这不是一个好建议。使用与预期插入的项目数相同的容量和“ 1”的加载因子,您必然会发生大量的哈希冲突。这将是性能灾难。


结论

如果您不了解事物的工作原理,请不要尝试进行微优化。

  • 我是在很久以前问过这个问题的,所以是的,天真让我受益匪浅。如果我没记错的话,我所在的公司的服务器基本上已满,并且我一直在寻找释放该应用程序上的内存使用量的方法,以免杀死任何内容。话虽这么说,但我仍然很高兴回顾我仍然可以使用的信息。您的投票不佳可能是因为您的回答更多是(最初)批评,而且似乎有些stand头。但是再读一遍,我没听懂,也不明白你为什么回答。只是想让您知道,我作为OP欣赏信息的点点滴滴。 (4认同)