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