老问题,poi导出大量数据,请大家来分析分析我的测试。

心如刀割 2011-11-17 06:32:39
最近在搞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里。。
不知道大家有没有什么好的思路???
...全文
171 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingxingcao99 2012-05-29
  • 打赏
  • 举报
回复
写存储过程,在后台调用,1000条数据导一次,就差不多了。
CherryMs 2011-11-17
  • 打赏
  • 举报
回复
曾经导出个600M的TXT都没溢出- -
第二,我以为是查询出来的数据太多,都存在list里,占用的内存过多引起,接着我查出一条导出一条,不存在list里,这样的话还是不行。

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

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧