使用XSSF的OutOfMemory或GC开销

时间:2016-08-24 11:05:43

标签: java xssf

目前,我们正在使用XSSF将存储在DB中的记录导出为ex​​cel并下载。根据我们的要求,我们需要允许用户下载300万条记录。

使用XSSF,我们面临OutOfMemoryError:超出GC开销限制。

我做了一些研究,并了解到XSSF对内存的渴望。有人可以建议我更好地实现我的要求。请注意,我需要以excel格式下载数据,并且不想明确写入任何磁盘。

1 个答案:

答案 0 :(得分:0)

您可以使用POI API。 我们使用POI API在我们的程序中成功实现了带有大型excel文件的流式传输。保持内存中的行大小很小很重要,其余的基本上都是在磁盘上完成的。

您还可以设置:SXSSFWorkbook.setCompressTempFiles,以防止临时XML文件在磁盘上变大。

使用flushRows(),您可以手动将行刷新到磁盘。

然而,这更慢。但如果内存是一个约束唯一的选择。

请记住一些方法,隐式访问行。如果这些行已经交换到磁盘,您将遇到错误,我相信该API仅用于编写大型Excel文件。

public static void main(String[] args) throws Throwable {
        SXSSFWorkbook wb = new SXSSFWorkbook(); 
        wb.setCompressTempFiles(true);

        SXSSFSheet sh = (SXSSFSheet) wb.getSheetAt(0);
        sh.setRandomAccessWindowSize(100);// keep 100 rows in memory, exceeding rows will be flushed to disk, this is also the default
        for(int i=  1; i < 100000; i++){
          Row row = sh.createRow(i);  // do something with the row
        }
    }