亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用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 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號