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

由于放进Map容器数据量很大,一次性放入的话会导致堆溢出,假如有1010万条记录,如何限制Map的输出记录数,当Map里存放有100万条记录时就输出到文件,依此类推,第11次把最后剩余的10万条也输出到文件。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space




波斯汪
浏览 115回答 3
3回答

慕哥6287543

Java里一般是传递引用,而Map容器里,value也是保存的是引用,也就是一个指针。Map本身的内存占用其实不是很大。内存占用情况要按 指针指向的实例进行统计。也就是那些数据的大小统计。因为Map是一个值保存对象,让Map负责保存数据是不合理的设计。相反应该在 向Map对象写入数据的地方添加检查逻辑。比如Java代码&nbsp;&nbsp;void&nbsp;readData(SomeReader&nbsp;reader)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map<String,&nbsp;Object>&nbsp;datamap&nbsp;=&nbsp;new&nbsp;HashMap<String,&nbsp;Object>();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(null&nbsp;!=&nbsp;(Object&nbsp;data&nbsp;&nbsp;=&nbsp;reader.read())&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;extractKey(data);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;datamap.put(key,&nbsp;data);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(datamap.size()>10000)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;storeAndClearMap(datamap);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;

汪汪一只猫

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

qq_笑_17

我说一个思路哈。你可以自己定义一个put方法,在你的put方法里面首先判断map的size,每次到了i%100==0的时候就输出到文件,然后将map置为null,继续往里面添加数据,然后最后再把剩下的都输出,类似myPut(data)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(map.size%100==0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flushToFile();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(data);&nbsp;&nbsp;}&nbsp;&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java
JavaScript