记一次导出大数量excel,内存占用过大,导致jvm的oom

需求:大数量的excel导出,内容相同的行进行合并单元格操作(相邻的行内容单元格进行对比,内容相同的合并单元格),这样导致大量的数据会同一时间读入内存(大概1g),导致oom
原先用的工具类是:XSSFWorkbook workbook = new XSSFWorkbook();
后续改成: SXSSFWorkbook workbook = new SXSSFWorkbook();
XSSFWorkbook 和 SXSSFWorkbook 都是 Apache POI 库中用于操作 Excel 文件的类,但它们在内存使用和性能优化方面有显著的不同,适用于不同场景。下面是两者的工作原理对比:

1、 XSSFWorkbook
工作原理:
XSSFWorkbook 是 Apache POI 用于操作 .xlsx 格式(Excel 2007 及以后版本)文件的主要类。它基于 XML 结构,能够处理 Excel 文件的所有内容,包括文本、数字、样式、图片、图表等。

内存使用:XSSFWorkbook 会将整个 Excel 文件的内容加载到内存中。它会将所有的单元格内容、样式、图片等都保存在内存中。因此,文件越大,内存占用越大。
适用场景:适合处理小到中等大小的 Excel 文件,尤其是文件内容不会超过内存限制的情况下。由于将所有内容加载到内存,它不适合处理非常大的文件。
优点
完全支持 .xlsx 格式的所有特性(如单元格样式、合并单元格、图表等)。
操作灵活,可以对 Excel 文件的任何部分进行修改。
缺点
内存占用大,处理大文件时可能会导致内存溢出。
不适合需要生成非常大的 Excel 文件(例如几百万行数据)。
使用示例:
java
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet(“Sheet1”);
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0);
cell.setCellValue(“Hello, World!”);
2、 SXSSFWorkbook
工作原理:
SXSSFWorkbook 是 Apache POI 为了解决 XSSFWorkbook 在处理大数据时的内存问题而引入的一个类。SXSSFWorkbook 也是用于操作 .xlsx 文件,但它采用了流式处理技术。

内存使用:SXSSFWorkbook 的设计目标是减少内存占用。它通过将 Excel 文件的内容分批写入磁盘(而非全部加载到内存)来降低内存消耗。具体来说,它会将数据写入磁盘时生成的 XML 数据流中进行缓冲,只有部分数据(如当前的工作表和一小部分数据)会保持在内存中。
适用场景:适用于需要生成或处理非常大的 .xlsx 文件(例如包含百万级行数据的文件)。由于它通过流式写入数据到磁盘,内存消耗大大减少,因此它可以处理大于内存容量的文件。
优点:
内存占用非常小,能够处理大型文件,特别适合批量写入数据。
比 XSSFWorkbook 更高效地生成大量数据。
缺点:
不能完全支持 .xlsx 格式的所有功能。例如,SXSSFWorkbook 对单元格的样式支持有限,且不支持插入图表和图片等复杂内容。
操作上相对受限,特别是在需要频繁修改或读取已经写入的单元格时。
使用示例:
java
SXSSFWorkbook workbook = new SXSSFWorkbook(100); // 100 是内存中保持的行数
SXSSFSheet sheet = workbook.createSheet(“Sheet1”);
for (int i = 0; i < 1000000; i++) {
SXSSFRow row = sheet.createRow(i);
SXSSFCell cell = row.createCell(0);
cell.setCellValue("Row " + i);
}
3. 内存占用比较
特性 XSSFWorkbook SXSSFWorkbook
内存占用 高,整个文件数据都加载到内存中 低,数据分批写入磁盘,内存占用小
适用文件大小 适合小到中等大小的文件(几万行以内) 适合大文件(百万行以上)
文件写入速度 较慢,所有数据必须同时在内存中 较快,通过流式写入避免内存占用过高
文件特性支持 支持完整的 Excel 功能(图表、样式等) 功能有限,支持基本数据和样式操作
4. 性能对比
XSSFWorkbook:适用于小文件,因为它将文件加载到内存,读取和写入速度相对较快。文件大小大于内存限制时,可能导致内存溢出。

SXSSFWorkbook:适用于大文件,因为它使用流式写入,只在内存中保持少量数据,因此能够高效处理大量数据。写入速度可能稍慢,但能避免内存溢出。

5. 选择依据
如果你需要处理 小型文件,并且需要处理 Excel 文件的 所有特性(例如复杂的样式、图表等),则选择 XSSFWorkbook。
如果你需要处理 大型文件(如数百万行数据),并且对 内存占用 有较高要求,且不需要处理非常复杂的 Excel 功能(如图表或高级样式),则选择 SXSSFWorkbook。
总结:
XSSFWorkbook:适用于处理小文件或中等大小的文件,支持完整的 Excel 功能,但内存占用较大。
SXSSFWorkbook:适用于处理大文件,能够通过流式处理降低内存占用,适合批量写入数据,但功能相对有限。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值