excel byte字节流导致内存溢出

大数据量excel生成 多次生成(第二次或者第三次) 导致服务重启

业务场景: 服务A后台使用easyexcel 生成 excel 转byte流(全程没有实体文件) 生成文件流后 通过feign 传至服务B 最后通过服务B 上传至储存桶

目前服务A 多次生成后会导致内存溢出直接重启服务(容器部署)

想问一下有什么较好的解决方案
或者 有没有什么excel分批写的依赖 我写一点转一点字节流 传一点

分批次写也不太行 虽然你查数据是分批次查 但是整体写动作是一次性的 理想状态是 我读取一点数据 (10w行) 马上就可以转为字节流 通过分段上传方式存入桶里

在处理大数据量的 Excel 文件时,内存溢出是一个常见的问题。以下是一些可能的解决方案:

  1. 使用SXSSFWorkbook
    在使用POI进行大数据量Excel文件生成时,可以考虑使用SXSSFWorkbook类,它可以使用一些内存缓存技术来处理大量数据,而不是将所有数据加载到内存中,从而避免内存溢出。

  2. 分批次写入Excel文件
    可以考虑将数据拆分成多个批次,每次只写入一部分数据。这种方法需要对数据进行分组,然后逐个分批次写入Excel文件。可以使用Apache POI或EasyExcel等工具来实现。

以下是使用EasyExcel进行分批次写入Excel文件的示例代码:

// 从数据库中获取数据
List<Data> dataList = getDataFromDatabase();

// 每批次的数据量
int batchSize = 10000;

// 计算分批次的数量
int batchCount = (dataList.size() + batchSize - 1) / batchSize;

// 分批次写入Excel文件
for (int i = 0; i < batchCount; i++) {
    // 计算当前批次的起始位置和结束位置
    int fromIndex = i * batchSize;
    int toIndex = Math.min(fromIndex + batchSize, dataList.size());

    // 获取当前批次的数据
    List<Data> batchData = dataList.subList(fromIndex, toIndex);

    // 使用EasyExcel将数据写入Excel文件
    ExcelWriter excelWriter = EasyExcel.write(outputStream, Data.class).build();
    WriteSheet writeSheet = EasyExcel.writerSheet(i).build();
    excelWriter.write(batchData, writeSheet);
    excelWriter.finish();
}
  1. 优化代码逻辑
    如果还是无法解决内存溢出问题,可以考虑优化代码逻辑,尽量减少内存占用。例如,可以考虑使用缓存和分页等技术,只加载必要的数据。此外,也可以考虑优化代码中的循环、递归和嵌套等操作,尽量减少内存占用。

希望这些解决方案对你有所帮助。望采纳

在处理大量数据并生成Excel文件时,内存溢出是一个常见的问题。以下是几个可能的解决方案:

适当减少内存使用:你可以通过适当减少内存使用来降低内存溢出的风险。比如,你可以使用一些优化技巧,例如逐行读取和写入数据、使用缓存等等。你也可以在生成Excel文件时使用一些流式处理的库,例如Apache POI的SXSSF库,这个库能够以流的方式生成Excel文件,从而避免内存溢出的问题。

增加JVM内存:如果你无法减少内存使用,那么你可以考虑增加JVM内存。可以通过在启动服务时设置JVM的-Xms和-Xmx参数来增加JVM内存。例如,可以将-Xms和-Xmx设置为2GB或更大的值。但是,需要注意的是,增加JVM内存会占用更多的系统资源,因此你需要权衡好内存使用和系统资源的平衡。

分批处理数据:如果你的数据量非常大,那么你可以考虑将数据分成多个批次处理,每个批次处理一部分数据,生成一部分Excel文件。这样可以避免一次性处理过多的数据,减少内存占用,从而降低内存溢出的风险。

使用分布式计算框架:如果你的数据量非常大,单机处理已经无法满足需求,那么你可以考虑使用分布式计算框架来处理数据,例如Apache Spark等等。使用分布式计算框架可以将数据分成多个部分,分配给不同的计算节点处理,从而提高计算效率和并发性。

优化Excel文件格式:如果你的Excel文件格式较为复杂,那么你可以考虑优化Excel文件格式,减少Excel文件的大小和复杂度。例如,可以删除不必要的格式、样式和公式等等,只保留必要的数据和格式。

希望以上建议对你有所帮助。
有用望采纳。

检查是不是有对象没释放,有内存泄漏

分批次的传输肯定是前提,其次是你现在使用的 easyexcel 这个API
它最大支持行数 1048576,如果超过了可能会出现溢出的情况,另外可以尝试使用更大的API来处理,比如SXSSFWorkbook它支持较大的文件处理。基本是这个思路