【springmvc+mybatis项目实战】杰信商贸-28.POI百万数据打印

POI 百万数据的打印 

1)从数据库读取数据,LIST在构造时十分耗费内存,还占用CPU资源
2)Xlsx一个单sheet可以支持1048576条数据。它加工这些数据时,都是暂时放在内存中。报内存堆溢出。

POI意识到这个问题,它在高版本解决了海量数据导出时性能问题。可以实现非常平滑的导出。

下面是我们编写的测试方法:
@Test
public void testPrint()throws IOException{
	String xlsFile="F://out.xlsx";
	
	Workbook wb=new XSSFWorkbook();//XSSF操作Excel2007以上版本
	Sheet sheet=wb.createSheet("海量数据测试簿");
	
	Row nRow=null;
	Cell nCell=null;
	
	
	for (int i=0;i<10000;i++) {
		System.out.println(i);
		nRow=sheet.createRow(i);
		for (int j=0; j<20; j++) {
			nCell=nRow.createCell(2);
			nCell.setCellValue("我是单元格");
		}
	}
	
	//创建单元格样式
	CellStyle tStyle=wb.createCellStyle();
	Font nFont=wb.createFont();
	nCell.setCellStyle(this.textStyle(wb,tStyle,nFont));
	
	OutputStream os=new FileOutputStream(new File(xlsFile));
	wb.write(os);
	os.flush();
	os.close();
	
}

这里我们将要打印万条数据,同时我们还要检测我们的内存情况,这个时候我们要使用一个内存查看器,在企业中常用的一个小型的内存查看工具

Jdk自带的 jvisualvm.exe


我们打开jvisualvm.exe,发现其中可以检测本地多个程序的多个渠道的信息(如线程):



我们下面来运行我们的testPrint方法,来看看它对我们的本地内存的影响:
执行前监视情况

开始执行


执行后监视情况

执行后CPU情况


可以看到,我们刚刚才10万级别的数据,内存就已经将近过半了,所以百万级别的数据一定会内存泄露,所以我们要进行优化

对于百万级数据,我们可以进行以下优化:
1)TOMCAT 启动参数变大
2)Myeclipse启动参数调整
3)Jvm启动参数调整

使用POI ooxml SXSSF对象,注意引入jar包:
poi-ooxml-3.9.jar
poi-ooxml-schemas-3.9.jar

它解决思路:
在打印过程中,已经加工完的对象,临时存到一个临时文件中,它采用xml临时文件。最终处理完时,将这些临时内容写入到最终的xlsx文件中。

我们在这里测试一下(100万条数据):
@Test
public void testPrint2()throws IOException{
	String xlsFile="F://out.xlsx";
	
	Workbook wb=new SXSSFWorkbook();//XSSF操作Excel2007以上版本
	Sheet sheet=wb.createSheet("海量数据测试簿");
	
	Row nRow=null;
	Cell nCell=null;
	
	
	for (int i=0;i<1000000;i++) {
		System.out.println(i);			nRow=sheet.createRow(i);
		for (int j=0; j<20; j++) {
			nCell=nRow.createCell(2);
			nCell.setCellValue("我是单元格");
		}
	}
	
	//创建单元格样式
	CellStyle tStyle=wb.createCellStyle();
	Font nFont=wb.createFont();
	nCell.setCellStyle(this.textStyle(wb,tStyle,nFont));
	
	OutputStream os=new FileOutputStream(new File(xlsFile));
	wb.write(os);
	os.flush();
	os.close();
	
}

过程中我们观察我们的CPU和监控,发现值明显低于之前我们使用HSSF以及XSSF。


同时生产一些临时文件也证实了它的优化机制是采用临时文件


我们如何将大数据导入数据库?
CSV文件,导入到数据库中。
CSV是一个标准的导入导出文件格式,实际是一个txt文件。

第一行是一个字段的标题,它们用逗号隔开。


在Sqlyog中导入CSV文件:



导入完成:

转载请注明出处:http://blog.csdn.net/acmman/article/details/48781897

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光仔December

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值