作者lovdkkkk (dk)
看板java
标题Re: [问题] hashmap 的效能 (300mb档案)
时间Mon Aug 27 01:32:40 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]);
: sb.delete(0, sb.length());
: }
: 这样写效能奇差无比...
: 还会爆掉 Q_Q
: 请问有办法可以改善吗 QQ?
试着用 char array, 记忆体是有省一点,
一百万笔乱生的测资来说, 原本的方法会吃 172 MB,
改用 char array 剩 134 MB
约省 1/4, 依原本 30/100 就快爆的情况来看可说没有帮助
附没帮助的 code
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main (String args[]) throws Exception {
File srcFile = new File( "test.txt" );
BufferedReader br =
new BufferedReader(new InputStreamReader(
new FileInputStream(srcFile), "UTF-8"));
int ch;
char[] cbuf = new char[30]; // buffer
int offset = 0; // buffer offset
String value = null;
Map map = new HashMap(1000000);
boolean foundFirstColumn = false;
Runtime rt = Runtime.getRuntime();
while ((ch = br.read()) != -1) {
cbuf[offset] = (char)ch;
offset++;
if (!foundFirstColumn) {
if ((char)ch == ' ') {
value = new String(cbuf, 0, offset - 1); // save value, escape ' '
foundFirstColumn = true; // found first column of this line
offset = 0; // reset buffer offset
}
} else {
if ((char)ch == '\n') {
map.put(new String(cbuf, 0, offset - 1), value); // escape '\n'
offset = 0;
foundFirstColumn = false; // next line
}
}
}
br.close();
System.out.println((rt.totalMemory()-rt.freeMemory())/1024/1024 + " MB");
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.168.2.119
1F:→ lovdkkkk:加个 gc 的话是 159/130 08/27 01:40
2F:推 love112302:谢谢您,用手机不方便看QQ明早来研究一下 08/27 03:24
3F:推 AI3767:请问一下,300mb,若1行1笔资料30byte,不是大约有1000万笔? 08/27 05:05
4F:推 love112302:是的 大概一千万笔 08/27 14:59
5F:推 AI3767:我自己生成326mb,约984万笔, 用String要用2.8g,byte[]则1g 08/27 15:50