Re: [問題] hashmap 的效能 (300mb檔案)
※ 引述《love112302 (小黑炭)》之銘言:
: 手上有一個文字檔 300mb
: 檔案內容有3個 column中間隔1個空白
: 每一個column裡面資料長度不同
: 1 2 3
: 1.1 2 3
: 類似這樣
: 我想要把這個檔案裏面的第一欄放到HashMap裡面
: 這樣之後比對比較方便 (map.contain(key))
: 我把第二欄與第三欄append起來做為Key值
: StringBuilder sb = new StringBuilder();
: String temp = "";
: String key ="";
: while( (temp = br.readLine()) != null){
: String[] items = temp.split(" ");
: key = sb.append(items[1]).append(items(" ")[2]).toString();
: map.put(key, items[0]);
: }
: 這樣寫效能奇差無比...
: 還會爆掉 Q_Q
: 請問有辦法可以改善嗎 QQ?
你的 code 有問題,
你把 sb 宣告在外面,
然後在 while loop 內 一直重複使用...
所以你每次都在 sb 中加入一筆資料,
記憶體肯定爆掉的.
舉例來說, 假設每一筆資料是 1 MB, 總共 300 筆, 300 MB
依次迴圈
1M, 2M, 3M ....300M (1+300)/2 * 300 = 45000 MB
你可以,每次使用 sb 之前, 清除之前的內容, 或者直接 new 一個新的
另外 300 MB 可能還是會爆, 建議你用 -XMX 增加 JVM 的記憶體配置大小
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 66.235.3.150
推
08/26 12:09, , 1F
08/26 12:09, 1F
喔喔...那問題點就不在這.. 我猜你的資料筆數可能太多了,
造成 HashMap 很常需要 Resize, 這對效能很傷, 你可以試試
new HashMap(10000) <- 給個適合的數字.
降低碰撞 跟 Resize 的機會..
每一次的 Resize, 都需要重新要一塊更大(double?) 的空間
然後把舊資料給複製過去
另外就是把 JVM 記憶體開大點... -XMX 把上限弄大一點
當然如果就查詢需要, 你也可以改用資料庫方式, SQL Lite/ Java內建也有
針對 item[1]+item[2] 建個 index 效能也是可以的.
※ 編輯: byend 來自: 66.235.3.150 (08/26 14:59)
推
08/26 15:43, , 2F
08/26 15:43, 2F
推
08/26 20:45, , 3F
08/26 20:45, 3F
推
08/26 20:59, , 4F
08/26 20:59, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 7 篇):