Re: [問題] hashmap 的效能 (300mb檔案)

看板java作者 (漫步)時間11年前 (2012/08/26 07:42), 編輯推噓4(400)
留言4則, 1人參與, 最新討論串2/7 (看更多)
※ 引述《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
您好,我有在程式裡面加入 sb.delete(0, sb.length());
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
直接指定size快了n倍耶..........
08/26 20:45, 3F

08/26 20:59, , 4F
我錯了 QQQ 我沒有塞值進去= = 還是很慢 QQ
08/26 20:59, 4F
文章代碼(AID): #1GEMBlzH (java)
討論串 (同標題文章)
文章代碼(AID): #1GEMBlzH (java)