You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何加速从S3获取10GB+CSV文件并作为附件返回?

优化大S3 CSV文件的下载响应效率

你的代码慢的核心问题是一次性把10GB的文件全量加载到内存,再转成字符串后才发送给客户端——这不仅会吃掉大量服务器内存,还得等整个文件从S3下载完才能开始响应,自然延迟极高。下面是针对性的优化方案:

核心优化:改用流式传输

直接利用S3的流式读取能力,把文件分块从S3拉取,同时实时推送给客户端,不需要把整个文件存在内存里。

修改后的代码

async getS3Object(params: any) {
  try {
    // 创建S3文件读取流
    const s3Stream = s3.getObject(params).createReadStream();

    // 设置下载响应头
    res.setHeader('Content-Disposition', `attachment; filename=${fileId}.csv`);
    res.setHeader('Content-Type', 'text/csv');
    // 明确告知客户端分块传输(部分框架会自动处理,手动设置更稳妥)
    res.setHeader('Transfer-Encoding', 'chunked');

    // 将S3流直接管道到响应对象,边读边发
    s3Stream.pipe(res);

    // 处理流读取过程中的错误
    s3Stream.on('error', (err) => {
      console.error('读取S3文件出错:', err);
      if (!res.headersSent) {
        res.status(500).send('文件下载失败');
      }
    });
  } catch (err) {
    console.error('初始化S3流失败:', err);
    res.status(500).send('无法启动文件下载');
  }
}

额外优化点

  • 去掉不必要的字符串转换:原代码里把data.Body转成utf-8字符串完全多余,CSV文件可以直接以二进制流传输,减少CPU的额外开销。
  • 确保S3与服务器同区域:如果你的服务器和S3存储桶不在同一个AWS区域,跨区域传输会增加延迟,尽量把两者放在同一区域。
  • 可选:启用Byte Range支持:如果需要支持断点续传,可以在响应头里添加Accept-Ranges: bytes,不过对于直接作为附件下载的场景,流式传输已经足够解决速度问题。

内容的提问来源于stack exchange,提问作者boomchickawawa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:06:13