作者pttnews (PTT新聞)
看板java
標題[問題] 如何用串流傳遞資料
時間Wed Dec 7 10:29:46 2011
我最近做一個Class 可以分析巨大文字檔裡面的資料。50M bytes
會遇到memory out Exception
步驟如下
A function
1. 用BufferedReader串InputStreamReader讀取檔案
2. 初步分析資料
3. 存入ArrayList
4. 回傳ArrayList
B function
1. 取出ArrayList
2. 切割資料
3. 存入HashMap,順便統計資料重複的次數
C function
1. 分析hashMap,找出重複的次數太少,砍除垃圾的資訊
2. 回傳hashMap
D fuction
1. 取出HashMap,存檔
因為在 B function 步驟3,吃掉太多記憶體,就memory out Exception
我的想法是把 ABCD function 串在一起
D(C(B(A(in))))
就像
BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(FileName),CharSet ));
每個function 之間都用Stream 串連 ,不要用Collection 作暫存
不要用Memory 做暫存
請問要如何達成呢?
謝謝大家
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.175.188
推 swpoker:不如拿sqlite來做好了~ 12/07 11:40
推 PsMonkey:同樓上,就塞個資料庫解決 12/07 14:46
謝謝樓上
sqlite很好用,但是會很慢,
用Memory 做暫存,搜尋時間是0.01 ms為單位
用sqliten搜尋時間會是0.1s為單位,以上是粗估略不會很精準。
該程式為最後分析結果的有效資料是1百萬筆,
中間的暫存資料可能是有效資料的五倍以上,用db 可能會非常慢,
謝謝大家
※ 編輯: pttnews 來自: 59.120.175.188 (12/07 15:12)
推 swpoker:記憶體裡面只存統計資料~實際資料寫到檔案或DB去 12/07 17:00
→ swpoker:記憶體的統計資料跟實際資料的媒體用KEY來對映 12/07 17:02
→ swpoker:寫入暫存資料可以用多執行緒去做~ 12/07 17:04
推 Chikei:用BDB這類的K/V DB 12/07 17:15
→ adrianshum:重點是你的工作不靠 collection 能做到嗎? 12/08 08:52
→ adrianshum:又統計重複次數,又砍垃圾資訊的。這類要收完才能做吧 12/08 08:53
推 PsMonkey:塞資料庫很慢? 那你應該是沒有用批次 execute 12/08 09:14