看板 java 關於我們 聯絡資訊
我最近做一個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