有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java OutOfMemory或带有XSSF的GC开销

目前,我们正在使用XSSF将数据库中存储的记录导出到excel并下载。根据我们的要求,我们需要允许用户下载300万条记录

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

我做了一些研究,了解到XSSF对记忆的渴求。有人能给我提供更好的方法来达到我的要求吗。请注意,我需要下载excel格式的数据,不想显式写入任何磁盘


共 (1) 个答案

  1. # 1 楼答案

    你可以使用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
            }
        }