java-处理大型HashMap的内存有效方式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-处理大型HashMap的内存有效方式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2218字,纯文字阅读大概需要4分钟。
内容图文
![java-处理大型HashMap的内存有效方式](/upload/InfoBanner/zyjiaocheng/949/d94ab2a8874a4fec98cefd086eff68a1.jpg)
我的项目正在处理正在写入excel文件的大量数据.我将此数据以Map< List< String> ;, Integer>的形式存储在静态HashMap中,其中列表的大小仅为3.但是,Map中的条目数可以在0到11,300之间变化.
该项目的流程为:
>使用条目加载地图
>迭代地图并执行操作
>清除地图以查找下一组条目
我最近发现的有关HashMap的信息是,当违反设置的大小时,它将如何重新调整大小.因此,不仅我的地图会不断调整其大小,而且到我清除最大的一组条目时,它很可能会有大约20,000个空条目.
因此,我正在尝试对该事物进行微优化,而在执行此操作时遇到了两难选择.我的两个想法是:
>将初始HashMap的默认值设置为一个值,该值最多只能调整一次
>使用每个新条目集的预期平均大小重新初始化HashMap,以限制重新调整大小并允许垃圾收集器进行一些清理
我的直觉告诉我,选项2可能是最合理的选择,但这仍然可以证明需要根据下一个条目集进行大量调整.但是,选项一极大地限制了一次操作的大小调整,但是实际上留下了成千上万个空条目.
我提出的两个解决方案中的一个是否比另一个更好,两者之间的内存改进没有太大区别,还是我可以监督其他解决方案(不涉及更改数据结构)?
编辑:仅在某些情况下,我想这样做,因为项目偶尔会用完堆内存,并且我试图确定此巨大映射的影响程度是多少.
EDIT2:只是为了澄清,地图本身的大小是较大的值.密钥大小(即列表)永远只有3.
解决方法:
我做了一些研究,最终显示在此页面:How does a HashMap work in Java
最后一个标题与调整大小有关,指出HashMap的默认大小为16,factorLoad为0.75.
您可以在初始化时更改这些值,因此大小为11300,factorLoad为1,这意味着在满足您的最大值之前,地图的大小不会增加,就您而言,据我所知,它将永远不会增加.
我使用以下代码进行了快速实验:
public static void main(String[] args) throws Exception {
Map<String, Integer> map = new HashMap<>(11000000, 1);
// Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < 11000000; i++) {
map.put(i + "", i);
}
System.out.println(map.size());
Thread.sleep(9000);
}
交换两个Map初始化,然后检查它在任务管理器中消耗的内存.
设置了初始大小并设置了factorLoad后,它将使用约1.45GB的内存.
如果不设置这些值,它将使用约1.87GB的内存.
每次都重新初始化Map而不是清除它以替换可能较小的Map会比较慢,但是您可能会暂时获得更多的内存.
您也可以同时做.如果您知道每个循环的List对象的数量,请重新初始化以设置初始大小和factorLoad属性.
该文章还建议,尽管Java 8 HashMap可能更快,但也可能比Java 7具有更多的内存开销.可能值得尝试在两个版本中都编译该程序,并看看它提供了一种改进的内存解决方案.如果没有其他事情,那将很有趣.
内容总结
以上是互联网集市为您收集整理的java-处理大型HashMap的内存有效方式全部内容,希望文章能够帮你解决java-处理大型HashMap的内存有效方式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。