`
longgangbai
  • 浏览: 7337962 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

POI3.8组件研究(八)--基于SXSSF (Streaming Usermodel API)的写文件

 
阅读更多

      在POI3.8中SXSSF仅仅支持excel2007格式是对XSSF的一种流的扩展。目的在生成excel时候,需要生成大量的数据的时候,通过刷新的方式将excel内存信息刷新到硬盘的方式,提供写入数据的效率。

官方原文如下:

SXSSF (Streaming Usermodel API)

Note
          SXSSF is a brand new contribution and some features were added after it was first introduced in POI 3.8-beta3. Users are advised to try the latest build from trunk. Instructions how to build are here .

SXSSF (package: org.apache.poi.xssf.streaming) is an API-compatible streaming extension of XSSF to be used when very large spreadsheets have to be produced, and heap space is limite d. SXSSF achieves its low memory footprint by limiting access to the rows that are within a sliding window, while XSSF gives access to all rows in the document. Older rows that are no longer in the window become inaccessible, as they are written to the disk.

                 You can specify the window size at workbook construction time via new SXSSFWorkbook(int windowSize) or you can set it per-sheet via SXSSFSheet#setRandomAccessWindowSize(int windowSize)

When a new row is created via createRow() and the total number of unflushed records would exceed the specified window size, then the row with the lowest index value is flushed a nd cannot be accessed via getRow() anymore.

                   The default window size is 100 and defined by SXSSFWorkbook.DEFAULT_WINDOW_SIZE.

A windowSize of -1 indicates unlimited access. In this case all records that have not been flushed by a call to flushRows() are available for random access.

The example below writes a sheet with a window of 100 rows. When the row count reaches 101, the row with rownum=0 is flushed to disk and removed from memory, when rownum reaches 102 then the row with rownum=1 is flushed, etc.

 

测试代码如下:

package com.easyway.excel.events.stream;

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
/**
 * SXSSF (Streaming Usermodel API)
 *     当文件写入的流特别的大时候,会将内存中数据刷新flush到硬盘中,减少内存的使用量。
 * 起到以空间换时间作用,提供效率。
 * 
 * @Title: 
 * @Description: 实现TODO
 * @Copyright:Copyright (c) 2011
 * @Company:易程科技股份有限公司
 * @Date:2012-6-17
 * @author  longgangbai
 * @version 1.0
 */
public class SXSSExcelEvent {
	public static void main(String[] args) throws Throwable {
		//创建基于stream的工作薄对象的
        Workbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk
		//SXSSFWorkbook wb = new SXSSFWorkbook(); 
		//wb.setCompressTempFiles(true); // temp files will be gzipped
        Sheet sh = wb.createSheet();
        //使用createRow将信息写在内存中。
        for(int rownum = 0; rownum < 1000; rownum++){
            Row row = sh.createRow(rownum);
            for(int cellnum = 0; cellnum < 10; cellnum++){
                Cell cell = row.createCell(cellnum);
                String address = new CellReference(cell).formatAsString();
                cell.setCellValue(address);
            }

        }

        // Rows with rownum < 900 are flushed and not accessible
        //当使用getRow方法访问的时候,将内存中的信息刷新到硬盘中去。
        for(int rownum = 0; rownum < 900; rownum++){
          System.out.println(sh.getRow(rownum));
        }

        // ther last 100 rows are still in memory
        for(int rownum = 900; rownum < 1000; rownum++){
        	System.out.println(sh.getRow(rownum));
        }
        //写入文件中
        FileOutputStream out = new FileOutputStream("C://sxssf.xlsx");
        wb.write(out);
        //关闭文件流对象
        out.close();
        System.out.println("基于流写入执行完毕!");
    }
}
 

         SXSSF flushes sheet data in temporary files (a temp file per sheet) and the size of these temporary files can grow to a very large value . For example, for a 20 MB csv data the size of the temp xml becomes more than a gigabyte. If the size of the temp files is an issue, you can tell SXSSF to use gzip compression:

  SXSSFWorkbook wb = new SXSSFWorkbook(); 
  wb.setCompressTempFiles(true); // temp files will be gzipped


分享到:
评论
4 楼 ae6623 2013-09-17  
ae6623 写道
楼主的 这句

//当使用getRow方法访问的时候,将内存中的信息刷新到硬盘中去。

什么意思,不使用这个方法getRow()就不可以释放内存么?必须调用一下去释放吗?


奥 明白了,楼主是为了输出,看一下 是否为null,从而确定已经从内存中释放掉了。原来的是这么写的:

// Rows with rownum < 900 are flushed and not accessible
        for (int rownum = 0; rownum < 900; rownum++) {
            Assert.assertNull(sh.getRow(rownum));
            Assert.assertNull(sh1.getRow(rownum));
        }

        // ther last 100 rows are still in memory
        for (int rownum = 900; rownum < 1000; rownum++) {
            Assert.assertNotNull(sh.getRow(rownum));
            Assert.assertNotNull(sh1.getRow(rownum));
        }
3 楼 ae6623 2013-09-17  
楼主的 这句

//当使用getRow方法访问的时候,将内存中的信息刷新到硬盘中去。

什么意思,不使用这个方法getRow()就不可以释放内存么?必须调用一下去释放吗?
2 楼 longgangbai 2012-07-04  
1R1 写道
SXSSF 这个速度上不去哦,100W行得7-8分钟的样子,不知道楼主有没有根据rowAccessWindowSize这个调优的可以分享下?还是得改造SXSSF这个代码

不好意思,我没有尝试,起始100W行这样的大数据量的话,最好循环刷新到硬盘,减少内存使用。我是这样的理解。希望继续沟通!
1 楼 1R1 2012-06-26  
SXSSF 这个速度上不去哦,100W行得7-8分钟的样子,不知道楼主有没有根据rowAccessWindowSize这个调优的可以分享下?还是得改造SXSSF这个代码

相关推荐

    poi-3.8-POI-HSSF和POI-XSSF和SXSSF.rar

    3. SXSSF (Streaming Usermodel API):自POI 3.8 beta3版本开始引入,SXSSF是为了应对大数据量Excel处理而设计的。它是一个内存效率更高的API,适合处理大量数据,尤其是当内存有限时。SXSSF通过将部分数据写入磁盘...

    poi-3.8-20120326.jar 和 poi-excelant-3.8-20120326.jar

    4. **数据流处理**:为了处理大数据,POI提供了SXSSF(Streaming Usermodel API),它可以在内存有限的情况下处理大型Excel文件,通过写入磁盘进行临时存储。 5. **公式处理**:POI能够解析和计算Excel中的公式,这...

    poi-3.8的6个包

    在项目中使用POI 3.8,特别是这个版本提及的“缓存机制”,可能指的是POI的优化策略,如SXSSF(Streaming Usermodel API)。这种模型允许处理大量数据时只保留最近使用的行在内存中,从而避免了内存溢出的问题,特别...

    poi-3.8-3.9-3.10-4.1.0.zip

    - **SXSSF(Streaming Usermodel API)**:这个模型是为了解决大文件内存消耗的问题,它在内存中只保留有限的行数,其余的存储在磁盘上。 - **XSSF(XML Spreadsheet API)**:适用于处理大量数据或需要复杂格式的...

    poi-3.8组件

    6. **性能优化**:在处理大量数据时,POI提供了一些优化策略,比如SXSSF(Streaming Usermodel API)允许在内存有限的情况下处理大型Excel文件,因为它将部分数据写入磁盘。 7. **错误处理**:在读取或写入过程中,...

    POI3.8和3.8的API

    5. **事件模型**:POI还引入了事件模型,如SXSSF(Streaming Usermodel API),这允许以低内存消耗处理大型Excel文件。通过事件模型,开发者可以只保留一部分数据在内存中,从而避免了大文件导致的内存溢出问题。 6...

    POI 3.8完整JAR 支持2003-2010Excel

    在处理大量数据时,Apache POI提供了一些性能优化策略,例如使用SXSSF(Streaming Usermodel API)代替传统的XSSF,可以在内存有限的情况下处理大型XLSX文件。 5. **应用示例**: - 数据分析:通过读取Excel文件...

    POI_3.8_API

    - **SXSSF(Streaming Usermodel API)**: 这是一个内存优化的API,适用于处理大型Excel文件。SXSSF将数据写入硬盘,而不是全部保留在内存中,从而避免内存溢出。 2. **Word处理**: - **HWPF(Horizontally ...

    POI 3.8解析Excel2003、Excel2007

    - 使用SXSSF(Streaming Usermodel API)可以处理大型Excel文件,因为它将数据写入磁盘,而不是全部加载到内存中。 8. **最佳实践** - 总是关闭Workbook对象以释放系统资源。 - 尽量避免不必要的遍历,只读取...

    poi-3.8-3.9-3.10.rar

    4. **内存管理**:由于处理大型Excel文件可能导致内存消耗过大,Apache POI提供了SXSSF(Streaming Usermodel API)作为低内存使用选项。SXSSF在内存中只保留最近使用的100行,其余数据写入磁盘,适合处理大量数据。...

    poi-bin-3.8-beta2 最新的poi包

    3. SXSSF(Streaming Usermodel API):这是一个内存优化的模型,特别适合处理大量数据,防止内存溢出。 在"poi-bin-3.8-beta2"压缩包中,主要包含以下内容: - `poi-3.8-beta2.jar`:这是Apache POI的核心库,...

    java\androi-poi3.8下载

    - POI 提供了低内存占用的处理方式,如SXSSF(Streaming Usermodel API),适合处理大型Excel文件,避免因内存消耗过大导致应用崩溃。 4. **灵活性:** - 支持多种Excel文件格式,包括老式的.BIFF8(Excel 97-...

    poi-3.8-20120326.jar

    4. **事件模型**:对于大文件处理,Apache POI提供了事件模型(Event API),如SXSSF(Streaming Usermodel API)和XSSFEventBasedExcelReader,以减少内存消耗。这些API适用于处理大量数据或服务器端的批量处理场景...

    poi3.8

    - SXSSF(Streaming Usermodel API)是内存优化的接口,适用于处理大型Excel文件,通过写入磁盘来避免内存溢出问题。 2. **Word处理**: - HWPF(Horrible Word Processor Format)用于处理旧版的Word文档(.doc...

    poi 3.8和4.1.2.rar

    可以通过调整工作簿的缓存策略,以及使用SXSSF(Streaming Usermodel API)来处理大数据量的情况。 版本间的差异: - Apache POI 3.8是较早的版本,可能不支持一些新特性,如XSSF对Excel 2007以上版本的支持和对新...

    POI 3.8 Beta5 创建大数据量 Excel文件

    POI提供了一种叫做“Streaming Usermodel”(SXSSF)的API,它可以以流式方式处理数据,从而减少内存占用。这种方式允许数据先写入硬盘,然后逐行读取,最后合并成一个完整的文件。 2. **批处理**:为了提高性能和...

    poi-3.8开发用所有jar包

    - **内存管理**:处理大型文件时,应考虑使用SXSSF(Streaming Usermodel API),以减少内存占用。 - **错误处理**:在实际使用中,要充分考虑文件损坏或格式不正确的情况,确保程序具有良好的错误处理机制。 5. ...

    java生成excel文件(poi).rar_POI java_java excel_poi EXCEL模板_poi-3.8-

    7. **性能优化**:处理大量数据时,可以使用SXSSF(Streaming Usermodel API)代替HSSF或XSSF,以减少内存占用。 在压缩包中的“www.pudn.com.txt”文件可能是关于该示例的说明或资源链接,而“java生成excel文件...

    poi_3.8_API

    - 对于处理大型文件,POI提供了SXSSF(Streaming Usermodel API),它在内存中只保留有限的行,从而降低了内存需求。 7. **读取和写入文件**: - `FileInputStream`和`FileOutputStream`用于读取和写入文件,配合...

    poi-3.8.jar包

    3. **SXSSF**(Streaming Usermodel API):这是一个内存效率更高的API,适用于处理大量数据。与HSSF和XSSF不同,SXSSF不将整个工作簿保留在内存中,而是采用只向前的流式接口,从而减少了内存消耗。 4. **HWPF**...

Global site tag (gtag.js) - Google Analytics