ava1749144759 2023-02-16 09:09 采纳率: 0%
浏览 22

excel byte字节流导致内存溢出

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

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

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

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

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

  • 写回答

4条回答 默认 最新

  • 菜鸟才能学的更多 2023-02-16 09:13
    关注

    在处理大数据量的 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. 优化代码逻辑
      如果还是无法解决内存溢出问题,可以考虑优化代码逻辑,尽量减少内存占用。例如,可以考虑使用缓存和分页等技术,只加载必要的数据。此外,也可以考虑优化代码中的循环、递归和嵌套等操作,尽量减少内存占用。

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

    评论

报告相同问题?

问题事件

  • 修改了问题 2月16日
  • 创建了问题 2月16日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。