为了账号安全,请及时绑定邮箱和手机立即绑定

用Map实现loadfactor还是不行,不知有没其它解决方案。

用Map实现loadfactor还是不行,不知有没其它解决方案。

波斯汪 2022-10-20 19:15:30
由于放进Map容器数据量很大,一次性放入的话会导致堆溢出,假如有1010万条记录,如何限制Map的输出记录数,当Map里存放有100万条记录时就输出到文件,依此类推,第11次把最后剩余的10万条也输出到文件。Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
查看完整描述

3 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

Java里一般是传递引用,
而Map容器里,value也是保存的是引用,也就是一个指针。
Map本身的内存占用其实不是很大。
内存占用情况要按 指针指向的实例进行统计。

也就是那些数据的大小统计。
因为Map是一个值保存对象,让Map负责保存数据是不合理的设计。
相反应该在 向Map对象写入数据的地方添加检查逻辑。
比如

Java代码  

  1. void readData(SomeReader reader) {  

  2.     Map<String, Object> datamap = new HashMap<String, Object>();  

  3.     while (null != (Object data  = reader.read()) {  

  4.       String key = extractKey(data);  

  5.       datamap.put(key, data);  

  6.       if (datamap.size()>10000) {  

  7.          storeAndClearMap(datamap);  

  8.       }  

  9.     }  

  10.  }  


查看完整回答
反对 回复 2022-10-24
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

apache commons 的org.apache.commons.collections.map.LRUMap可以解决内存溢出,写到文件这段功能,自己利用LRUMap重写下

查看完整回答
反对 回复 2022-10-24
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

我说一个思路哈。
你可以自己定义一个put方法,在你的put方法里面首先判断map的size,每次到了i%100==0的时候就输出到文件,然后将map置为null,继续往里面添加数据,然后最后再把剩下的都输出,类似

  1. myPut(data) {  

  2.    if(map.size%100==0) {  

  3.       flushToFile();  

  4.    }  

  5.    map.put(data);  

  6. }  


查看完整回答
反对 回复 2022-10-24
  • 3 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信