Re: [問題] PipedInputStream 相關疑問

作者: lovdkkkk (dk)   2014-04-25 18:18:32
有理,
不過 by this case...
先說一下關於 Apache POI,
如果沒有自己 handle Streaming Usermodel,那它本身就非常吃記憶體,
詳情請自行估狗 "Apache POI Footprint" or "Apache POI OutOfMemory",
最近是有改善但有限。
所以真的怕大檔吃 memory 的話,其實就...
pipe 或什麼其它的 stream 讓你 GG 之前,
Apache POI 會先讓你 GG XDD。
寫一個 byte 讀一個 byte 其實也有點...奇怪?
因為用 Apache POI 我沒會錯意的話,
應該是要靠它拿 cell 裡的值然後自己加逗號,
特地對後來建出的字串一個一個 byte 處理...
不知道該怎麼說 "0rz
前面 Apache POI 應該已經吃掉
比你把資料全讀出來組好的 String 還多 n 倍的 memory 了,
這裡真的要搶回 memory 的話盡快把資料讀完,
讓 HSSF/XSSF workbook 設為 null 給 GC 最有效,
不然都有種 "省小條、開大條" 的感覺 @@"。
至於簡單,用 pipe input/output 互接看起來是有一點麻煩,
不過寫檔也一樣要讀出資料、加逗號再存成 CSV,
那或許可以考慮用簡單一點的 PrintStream,
(是說它也可以寫檔就是)
只要一直讀出來 append... append...,
讀完再拿 byte array 轉 input stream 就好,
這樣也是都在 memory 裡做掉,不過還是很簡單。
※ 引述《popcorny (畢業了..@@")》之銘言:
: ※ 引述《popcorny (畢業了..@@")》之銘言:
: : ㄜ.. 我說錯了
: : 資源不會浪費
: : 應該說你一個byte一個byte讀會很花時間
: : 要不然比較可以的做法是開兩個thread.
: : 一個寫pipe 一個讀pipe.
: : 這樣應該是最完美也最不佔資源的做法
: : 但我覺得用temp file是簡單又有效率的做法
: : 一次把全部csv寫到temp file
: : 再全部一次從temp file讀回來
: : 簡單易懂
: :
作者: lovdkkkk (dk)   2014-04-25 21:07:00
再想了一下, 直接用 StringBuilder 然後轉 Stream 也行

Links booklink

Contact Us: admin [ a t ] ucptt.com