Re: [問題] hashmap 的效能 (300mb檔案)
※ 引述《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
→
08/27 01:40, , 1F
08/27 01:40, 1F
推
08/27 03:24, , 2F
08/27 03:24, 2F
推
08/27 05:05, , 3F
08/27 05:05, 3F
推
08/27 14:59, , 4F
08/27 14:59, 4F
推
08/27 15:50, , 5F
08/27 15:50, 5F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 7 篇):