大数据量excel生成 多次生成(第二次或者第三次) 导致服务重启
业务场景: 服务A后台使用easyexcel 生成 excel 转byte流(全程没有实体文件) 生成文件流后 通过feign 传至服务B 最后通过服务B 上传至储存桶
目前服务A 多次生成后会导致内存溢出直接重启服务(容器部署)
想问一下有什么较好的解决方案
或者 有没有什么excel分批写的依赖 我写一点转一点字节流 传一点
分批次写也不太行 虽然你查数据是分批次查 但是整体写动作是一次性的 理想状态是 我读取一点数据 (10w行) 马上就可以转为字节流 通过分段上传方式存入桶里
在处理大数据量的 Excel 文件时,内存溢出是一个常见的问题。以下是一些可能的解决方案:
使用SXSSFWorkbook
在使用POI进行大数据量Excel文件生成时,可以考虑使用SXSSFWorkbook类,它可以使用一些内存缓存技术来处理大量数据,而不是将所有数据加载到内存中,从而避免内存溢出。
分批次写入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();
}
希望这些解决方案对你有所帮助。望采纳
在处理大量数据并生成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它支持较大的文件处理。基本是这个思路