Re: [問題] PipedInputStream 相關疑問

看板java作者 (畢業了..@@")時間10年前 (2014/04/25 08:15), 編輯推噓4(402)
留言6則, 5人參與, 最新討論串5/7 (看更多)
※ 引述《popcorny (畢業了..@@")》之銘言: : ㄜ.. 我說錯了 : 資源不會浪費 : 應該說你一個byte一個byte讀會很花時間 : : 要不然比較可以的做法是開兩個thread. : 一個寫pipe 一個讀pipe. : 這樣應該是最完美也最不佔資源的做法 : : 但我覺得用temp file是簡單又有效率的做法 : 一次把全部csv寫到temp file : 再全部一次從temp file讀回來 : 簡單易懂 : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.228.241.51 : ※ 文章網址: http://www.ptt.cc/bbs/java/M.1398347517.A.A93.html : → lovdkkkk:可是寫檔讀檔很... 04/24 21:59 : 推 willy69wu31:我覺得寫檔讀檔這樣吃硬碟好像更花時間@@ 04/24 22:47 : 推 willy69wu31:不過還是感謝你的回應 04/24 22:49 : → danny8376:實際上完全不花時間 因為OS會幫你做好cache 04/25 01:09 讀寫檔比memory慢,這個是絕對的 但是回到原po說的 他想要寫一個byte讀一個byte 然而producer是apache poi 而consumer是已經寫好的程式 所以要這樣"Flow Control"應該很難寫吧... 如果要我寫可能選三個方法 1. 開兩個thread. 中間開pipe 兩邊一起跑,這是最完美的做法。 就跟unix like的command line pipe一樣的行為 2. producer寫到ByteArrayOutputStream 寫完把bytes拿出來放到ByteArrayInputStream去讀 免開thread. 也夠快.. 但是缺點就是檔案大吃太多memory 3. producer寫到temp file consumer從temp file讀 免開thread.. 也不怕檔案大 但選擇方案的時候我會有三個考量點要考量 a. 效率 b. 最大Memory使用量 (memory footprint) c. 程式碼簡單,流程單純。 如果你的效能是你很大的考量。 而且你的檔案有可能會很大。 那我建議你選1的方案。也算是大多數情況最好的解。 唯一的缺點就是流程復雜點,程式碼比較難懂。 退而求其次,如果今天你已經確定資料量不會太大 也許2是最好解。簡單,快速,易懂。 如果效能不會是太大考量。 也許你的程式你久久才跑一次這段程式 而每次跑也只是0.1秒跟0.001秒的差別。 那寫檔會是最簡單,不吃memory的做法 寫程式本來很多都是trade off 你必須要有能力可以評估 雖然效能差距1000倍 但是你的程式在這邊本來就不佔0.01%的時間 不是performance bottleneck 或是你的程式根本就久久才用一次這段code 那我們當然選擇一個易懂不易出錯很容易maintain的版本 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.228.241.51 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1398384909.A.754.html

04/25 08:19, , 1F
有理!
04/25 08:19, 1F

04/25 14:58, , 2F
04/25 14:58, 2F

04/25 15:16, , 3F
NICE
04/25 15:16, 3F

04/25 19:21, , 4F
推後四段, 但不存/讀檔直接轉 inputstream 應該較單純?
04/25 19:21, 4F

04/25 21:43, , 5F
04/25 21:43, 5F

04/26 10:19, , 6F
04/26 10:19, 6F
文章代碼(AID): #1JMQaDTK (java)
討論串 (同標題文章)
文章代碼(AID): #1JMQaDTK (java)