因为工作需求,客户要求把数据导出excel表格。开始时我们用的是开源的myxls组件,测试时还没问题,可是到了正常使用后程序老是爆出内存溢出的问题,经检测发现因为在用户使用中,一次导出的数据量超过数十万行,不内存溢出才怪~~,之前测试时因为数据量都比较小所以测试都没问题。上帝永远是上帝,我们查阅网络上的相关资料得出以下解决方案:

1.分页查询

2.是否存在死循环

3.是否有引用没有被收回

4.使用内存查看工具查看内存使用情况

而经分析,该方案不适用于我们的产品需求,因为客户需要的是一个完整的excel文件,来备份数据信息,所以再次研究 ,我们得出以下两种解决方案:
  • 使用分块输出;
1. 多文件输出方式;
2. 单文件多sheet输出;
  • 使用序列化对象的方式,分级输出序列化对象,最后在反序列化合并数据。
对于第一种方式而言,相当于在导入数据时也要考虑到多文件方式导入,而除非数据大量丢失不然上帝是不会经常使用导入功能的。导出多sheet也不是上帝想要看到的。
SO...... 我们采取了第二种方式,每 n(1000<n<10000)条数据序列化为一个对象存储到本地磁盘中,当数据提取完时,合并反序列化对象,存储为同一个excel文件,虽然这样做使数据导出过程变得相对复杂了,但是能支持同时导出数十及数百万的数据量,好处是那么的明显,原理有了...代码实现就简单了,无论你是用.net平台还是用java平台,他们都支持序列化对象操作。核心代码略