作者byend (漫步)
看板java
标题Re: [问题] hashmap 的效能 (300mb档案)
时间Sun Aug 26 07:42:36 2012
※ 引述《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
1F:推 love112302:您好,我有在程式里面加入 sb.delete(0, sb.length()); 08/26 12:09
喔喔...那问题点就不在这.. 我猜你的资料笔数可能太多了,
造成 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)
2F:推 love112302:了解!!等等回到研究室就试试 08/26 15:43
3F:推 love112302:直接指定size快了n倍耶.......... 08/26 20:45
4F:推 love112302:我错了 QQQ 我没有塞值进去= = 还是很慢 QQ 08/26 20:59