POI3.8的SXSSF包是XSSF的一个扩展版本,支持流处理,在生成大数据量的电子表格且堆空间有限时使用。SXSSF通过限制内存中可访问的记录行数来实现其低内存利用,当达到限定值时,新一行数据的加入会引起老一行的数据刷新到硬盘。
比如内存中限制行数为100,当行号到达101时,行号为0的记录刷新到硬盘并从内存中删除,当行号到达102时,行号为1的记录刷新到硬盘,并从内存中删除,以此类推。
rowAccessWindowSize代表指定的内存中缓存记录数,默认为100,此值可以通过
new SXSSFWorkbook(int rowAccessWindowSize)或SXSSFSheet.setRandomAccessWindowSize(intwindowSize)来设置。
SXSSF在把内存数据刷新到硬盘时,是把每个SHEET生成一个临时文件,这个临时文件可能会很大,有可以会达到G级别,如果文件的过大对你来说是一个问题,你可以使用下面的方法让SXSSF来进行压缩,当然性能也会有一定的影响。
SXSSFWorkbook wb = new SXSSFWorkbook(); wb.setCompressTempFiles(true); // temp files will be gzipped
例子:
生成三个SHEET,每个SHEET有6000行记录,共18万行记录
importjava.io.FileOutputStream;
importorg.apache.poi.ss.usermodel.Cell;
importorg.apache.poi.ss.usermodel.Row;
importorg.apache.poi.ss.usermodel.Sheet;
importorg.apache.poi.ss.util.CellReference;
importorg.apache.poi.xssf.streaming.SXSSFSheet;
importorg.apache.poi.xssf.streaming.SXSSFWorkbook;
public classSXSSFWorkBookUtil {
public voidtestWorkBook() {
try{
longcurr_time=System.currentTimeMillis();
introwaccess=100;//内存中缓存记录行数
/*keep 100 rowsin memory,exceeding rows will be flushed to disk*/
SXSSFWorkbook wb = newSXSSFWorkbook(rowaccess);
intsheet_num=3;//生成3个SHEET
for(inti=0;i<sheet_num;i++){
Sheet sh = wb.createSheet();
//每个SHEET有60000ROW
for(intrownum = 0; rownum < 60000; rownum++) {
Row row = sh.createRow(rownum);
//每行有10个CELL
for(intcellnum = 0; cellnum < 10; cellnum++) {
Cell cell = row.createCell(cellnum);
String address = newCellReference(cell).formatAsString();
cell.setCellValue(address);
}
//每当行数达到设置的值就刷新数据到硬盘,以清理内存
if(rownum%rowaccess==0){
((SXSSFSheet)sh).flushRows();
}
}
}
/*写数据到文件中*/
FileOutputStream os = newFileOutputStream("d:/data/poi/biggrid.xlsx");
wb.write(os);
os.close();
/*计算耗时*/
System.out.println("耗时:"+(System.currentTimeMillis()-curr_time)/1000);
} catch(Exception e) {
e.printStackTrace();
}
}
}
对于不同的rowAccessWindowSize值,用上面的例子进行耗时测试,结果如下:
rowAccessWindowSize Time(s)
5000 293
1000 69
500 43
100 20
50 18
10 16
1 15
以上测试结果是在个人笔记本电脑上进行的,配置为:
Dual-Core CPU T4400 2.2GHz 2.19GHz
Memory 1.86GB
以上测试过程只是进行了一次,并没有多次测试求平均值,数据也只想表达当设置不同的rowAccessWindowSize值,耗时的一种趋势。
可见一般情况下,使用默认值100即可。
相关推荐
绝对原创,这是我在项目中解决大数据Excel导入时内存溢出问题而编写的Excel行级解析器。同时支持Excel-2003和Excel-2007,excel-2003解析采用poi的eventusermodel模式实现,2007采用xmlreader实现,经项目验证,...
但是,需要注意的是,由于POI处理大型文件时可能消耗大量内存,所以在处理大文件时要特别注意内存管理,避免内存溢出。 总结来说,Apache POI 3.8是一个强大的Java库,能够有效地读取和写入Excel文件。正确导入必要...
5. 如果数据量大,可能需要分批写入,以避免一次性加载过多数据导致内存溢出。 在实际应用中,为了提高性能,可能还需要考虑异步处理、多线程等技术,以实现更高效的批量数据导出。此外,优化内存管理和设置适当的...
其次,在实验过程中,大数据量的导出很容易引发内存溢出,调整JVM的内存大小治标不治本。很多人建议保存为.CSV格式的文件。不过,.CSV方式导出也存在问题:首先,如果用excel来打开csv,超过65536行的数据都会看不见...
总之,Apache POI 3.8 中的SXSSFWorkbook是处理大数据量Excel文件的理想选择,它通过流式处理和磁盘缓存策略,有效地解决了内存限制问题,确保了大规模数据处理的可行性。在互联网和计算机科学(cs)领域,这样的...
XSSF支持更多的功能和更大数据量的处理。 - **SXSSF(Streaming Usermodel API)**: 这是一个内存优化的API,适用于处理大型Excel文件。SXSSF将数据写入硬盘,而不是全部保留在内存中,从而避免内存溢出。 2. **...
在Java开发中,导出大数据量的Excel文件可能会面临内存溢出的问题,特别是在使用Apache POI库时。这是因为默认情况下,POI会将整个Excel工作簿存储在内存中,当数据量过大时,内存消耗非常显著,可能导致系统崩溃。...
在Java中,向Excel写入海量数据时可能会遇到内存溢出的问题,特别是在使用Apache POI库处理Excel文件时。这是因为POI默认会将整个工作簿加载到内存中,当数据量巨大时,内存消耗非常快,导致Java虚拟机(JVM)内存...
使用`SXSSFWorkbook`,开发者可以将数据写入硬盘,而不仅仅是内存,这在处理大数据量的Excel文件时非常有用。但需要注意,如果使用3.8以下的版本,将无法使用`SXSSFWorkbook`。 3. **Apache POI 3.9**: 在3.9版本中...
Apache POI是一个流行的开源库,专门用于处理Microsoft Office格式的文件,如...不过需要注意的是,由于Apache POI处理的文件格式复杂,可能会消耗较多的内存,因此在处理大量数据时需谨慎设计程序,避免内存溢出。
在处理大型Excel文件时,3.17版本引入了SXSSF(Streaming Usermodel API),它可以有效地管理内存,防止因处理大量数据导致的内存溢出问题。此外,此版本还修复了一些已知的bug,并提升了整体性能和稳定性。 2. ...
在给定的文件中,"poi-3.8-20120326.jar" 和 "poi-excelant-3.8-20120326.jar" 是Apache POI库的特定版本,主要用于Java环境下读取和写入Excel文件。 Apache POI的核心功能: 1. **Excel文件处理**:Apache POI ...
在给定的压缩包"poi-3.17-3.8-3.9-3.10.zip"中,包含了Apache POI的多个版本,从3.17到3.8,这些版本可用于Java Web项目中的数据导入和导出功能。 **Apache POI主要知识点:** 1. **Excel处理**: - **HSSF**:...
读取Excel文件时,首先用`WorkbookFactory`的`create()`方法打开文件,然后遍历`Sheet`和`Row`,读取每个`Cell`的值。 7. **批处理**: 在批量导入时,可以一次读取多行数据,或者一次性写入多行数据。这可以通过...
这两种类型的 `Workbook` 在生成文件时,所有的数据都会被保留在内存中,这在处理大量数据时可能会导致内存溢出问题。 为了解决这个问题,Apache POI 引入了 `SXSSFWorkbook`。`SXSSFWorkbook` 的工作原理是利用...
Apache POI 是一个开源项目,专门用于处理微软的Office文档格式,如Excel...需要注意的是,处理大型文件时要注意内存管理,以避免因内存溢出导致的问题。同时,保持POI库的更新,以便获取最新的功能和修复的安全漏洞。
这种方式可以解决大型excel文件的创建时产生的内存溢出问题。SXSSFWorkbook是stream版本的XSSFWorkbook,它只会保存最新的excel rows在内存里供查看,在此之前的excel rows都会被写入到硬盘里。 在选择哪种方式时,...