作者ClareQ (人比人Cheese人)
看板java
标题Re: [问题] hashmap 的效能 (300mb档案)
时间Sat Sep 8 23:09:08 2012
原PO会记忆体不足或慢的原因,
可能是因为对Java的String处理不够了解所致。
应该可以从以下两点进行改善:
1.储存成key的多个栏位,不应串接起来。
原因:A.变成更长的String耗记忆体
B.可能导致错误,如A,BC和AB,C都变为ABC
解法:将原本String[]包覆成List,即可在Map中计算hashCode和equals
2.如果单栏位内容重复性高,尝试使用Java提供的String pool节省记忆体
原因:外部资料中若某栏位出现100次"2012",会占100份char[4]和String物件的记忆体
解法:intern()会在String pool中寻找已存在的来取代,使相同字串只需消耗1份记忆体
public static Map<List<String>,List<String>> file2map(
BufferedReader br, String colSep,
int[] keyCols,
int[] valCols)
throws IOException {
final int keys=keyCols.length,vals=valCols.length;
final Map<List<String>,List<String>> result=new LinkedHashMap();
for( String line;
null!=(line=br.readLine()); ){
final String[] cell=line.split(colSep);
final String[] key=
new String[keys], val=
new String[vals];
for(
int i=
0;i<keys;i++){
final int keyCol=keyCols[i];
key[i]=(cell[keyCol]=cell[keyCol].
intern());
//节省记忆体
}
for(
int i=
0;i<vals;i++){
final int valCol=valCols[i] ;
val[i]=cell[valCol];
//假设val栏位资料重覆率低,省略intern
}
result.put(Arrays.asList(key),Arrays.asList(val));
}
return result;
}
※ 引述《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?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.168.65.219
※ 编辑: ClareQ 来自: 118.168.65.219 (09/08 23:13)