日期:2014-05-20  浏览次数:20689 次

老问题,poi导出大量数据,请大家来分析分析我的测试。
最近在搞poi导出大量数据内存溢出的问题,搜遍所有相关的帖子都没找到好的办法。
经过测试发现几个问题,第一是创建太多的Cell,每一个Cell都是一个对象,假设1行有10列,就是10个Cell对象,1w行就是10万个,java也不容许手动回收对象,真是唯一的缺点。
我随便从表里取来几十万数据,然后一行10列的导出,大概到2万行就会溢出,然后一行只输出一列,可以输出到18万行。
第二,我以为是查询出来的数据太多,都存在list里,占用的内存过多引起,接着我查出一条导出一条,不存在list里,这样的话还是不行。
第三分批导出也会出现溢出,而且我是swing程序和web容器毫不相关,拿到公司上的服务器去跑也会出现溢出(公司服务器16G内存,8核CPU)。我是分1W行导出一次,记住导出的行数,然后再继续导出。最终还是失败。
接着我对比了导出文件的大小,好像poi最大只能导出1.1M大小的文件。再大就会爆掉。
现在真是没有办法了,数据还必须导入到excel里,因为还需要在导出的excel模板里进行数据分析,别人用vba写的程序,生成图形报表等。。
我现在准备把数据导出到txt里,让客户手动复制粘贴到excel里。。
不知道大家有没有什么好的思路???

------解决方案--------------------
曾经导出个600M的TXT都没溢出- -
第二,我以为是查询出来的数据太多,都存在list里,占用的内存过多引起,接着我查出一条导出一条,不存在list里,这样的话还是不行。

你可以边跑2个线程 一个查数据存进list 一个从list导出数据 导出之后删掉已经导出的数据 这样应该可以保持内存占用相对稳定 避免溢出 当然 数据量过大导致内存不足也是没办法的事- -