作者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
→ lovdkkkk:加個 gc 的話是 159/130 08/27 01:40
推 love112302:謝謝您,用手機不方便看QQ明早來研究一下 08/27 03:24
推 AI3767:請問一下,300mb,若1行1筆資料30byte,不是大約有1000萬筆? 08/27 05:05
推 love112302:是的 大概一千萬筆 08/27 14:59
推 AI3767:我自己生成326mb,約984萬筆, 用String要用2.8g,byte[]則1g 08/27 15:50