SXSSFWorkbook解决HSSFWorkbook和XSSFWorkbook造成的OOM问题及原理

HSSFWorkbook:处理Excel2003以前(包括2003)的版本,扩展名是.xls,不可以打开编辑07版的xlsx文件,行列的上限为65536行,256列。
XSSFWorkbook:处理Excel2007的版本,扩展名是.xlsx,也能打开编辑03版的xls文件,行列的上限为1048575行,16384列。

若是excel中数据量超过上述最大行数,由于HSSFWorkbook和XSSFWorkbook是在内存中进行数据处埋,如临时文件过大,且无法处理过量数据,则会导致OOM。

SXSSFWorkbook可用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel,用硬盘空间换内存。

SXSSFWorkbook处理方式:
当SXSSFWorkbook设置窗口数据的数目为100时,当处理到第101行的数据时,会将rownum=0的行的数据刷新到磁盘并从内存中删除,当rownum达到102时,将刷新rownum=1的行刷新到磁盘并从内存中删除,以此类推……

所以SXSSFWorkbook是用硬盘空间换内存,并且已经超出窗口数据量的数据,也就是写入磁盘的数据,无法再被读取。

以下文字内容均来自官方文档
官方文档链接:
https://poi.apache.org/spreadsheet/how-to.html#sxssf

SXSSF(package:org.apache.poi.xssf.streaming)是XSSF的API-compatible streaming的扩展,用于生成数据量很多的excel,并且能够进行分区。SXSSF通过对数据进行分区处理达到占用较小内存,而XSSF允许访问文档中的所有行。SXSSF超出处理窗口故据量的数据会被写入硬盘(Windows电脑的话,是写入到c盘根目录下的temp文件夹),所以SXSSF写入硬盘的数据无法在后续处理中再次进行访问。

可以通过new SXSSFWorkbook(int windowsize)在创建workbook时指定窗口容纳数据的大小,也可以通过SXSSFSheet#setRandomAccessWindowsize(int windowsize)按工作表设置窗口大小。

当通过createRow()创建了一行新的数据,但此时进行处理的指定的窗口数据量并没有进行更新,则这条创建出来的新的数据无法通过getRow()访问。

SXSSFWorkbook默认窗口数据量为100,可以通过SXSSFWorkbook.DEFAULT_WINDOW_SIZE进行设置。

windowSize为-1表示无限制访问。在这种情况下,所有未通过调用flushRows()刷新的记录都可用于随机访问。

注意:SXSSF会分配必须要通过调用dispose方法才能够删除的临时文件。

SXSSFWorkbook默认使用内联字符串而不是共享字符串表,这很大的节省了资源,因为没有文档内容需要保存在内存中,但也被称为制作与某些客户不兼容的文档。在启用共享字符串的情况下,文档中的所有唯一字符串必须保存在内存中。根据您的文档内容,这可能比共享字符串被禁用时使用更多的资源。

注意:存储在内存中的信息,如被频繁使用,仍然有许多东西可能会占用大量内存,例如:合并区域.超链接、评论…

可根据内存大小和兼容性需求,决定是否后用共享字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值