作者popcorny (毕业了..@@")
看板java
标题Re: [问题] PipedInputStream 相关疑问
时间Fri Apr 25 08:15:07 2014
※ 引述《popcorny (毕业了..@@")》之铭言:
: ㄜ.. 我说错了
: 资源不会浪费
: 应该说你一个byte一个byte读会很花时间
:
: 要不然比较可以的做法是开两个thread.
: 一个写pipe 一个读pipe.
: 这样应该是最完美也最不占资源的做法
:
: 但我觉得用temp file是简单又有效率的做法
: 一次把全部csv写到temp file
: 再全部一次从temp file读回来
: 简单易懂
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.228.241.51
: ※ 文章网址: http://webptt.com/cn.aspx?n=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://webptt.com/cn.aspx?n=bbs/java/M.1398384909.A.754.html
1F:→ qrtt1:有理! 04/25 08:19
2F:推 xw:推 04/25 14:58
3F:推 gmoz:NICE 04/25 15:16
4F:推 lovdkkkk:推後四段, 但不存/读档直接转 inputstream 应该较单纯? 04/25 19:21
5F:推 dream1124:推 04/25 21:43