繁体   English   中英

处理来自 S3 的大文件

[英]Process large files from S3

我正在尝试在 s3 上获取一个大文件(>10gb)(在 s3 上存储为 csv),并在响应 header 中将其作为 csv 发送。我正在使用以下过程进行操作:

async getS3Object(params:any) {

        s3.getObject(params, function (err, data) {
            if (err) {
              console.log('Error Fetching File');
            }
            else {
                const csv = data.Body.toString('utf-8');
                res.setHeader('Content-disposition', `attachment; filename=${fileId}.csv`);
                res.set('Content-Type', 'text/csv');
                res.status(200).send(csv);
            }
          });

处理文件并将其作为 csv 附件发送的时间非常长。 我怎样才能让它更快?

您正在处理一个巨大的文件; 您可以使用范围将其分成块(另请参阅文档,搜索“调用 getobject 属性” )。 如果您需要整个文件,您可以将工作拆分为workers ,尽管在某些时候限制可能是您的连接,如果您需要将整个文件作为附件发送,那将无济于事。

更好的解决方案是从一开始就不要下载文件。 您可以通过从 S3 进行流式传输另请参阅 this 和 this )或在您的服务器中设置代理来执行此操作,以便客户端认为存储桶/子目录位于您的应用程序中。

如果您在 EC2 上运行它,EC2 实例的网络性能会因 EC2 类型和大小而异。 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance.network-bandwidth.html

瓶颈可能发生在多个地方:

  • 网络(带宽和延迟)
  • 中央处理器
  • Memory
  • 本地存储

可以检查其中的每一项。 CloudWatch Metrics 是我们的朋友。

CPU 是最容易看到的,并且可以使用更大的实例大小进行扩展。

Memory 有点难观察,但应该有足够的 memory 来保存 memory 中的文档,因此操作系统不使用交换。

Local Storage——可以观察到IO; 如果业务逻辑只是解析 csv 文件和 output 结果,比方说,另一个 S3 存储桶,并且不需要在本地保存文件 - 可以使用具有本地存储的 EC2 实例 - https://aws。 amazon.com/ec2/instance-types/ - 存储优化。

网络 - 可以修改 EC2 实例大小,或者可以使用网络优化实例。

网络 - 连接到 S3 的方式很重要。 通常,最好的方法是使用 S3 VPC 端点https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html 网关选项可免费使用。 采用它,消除了VPC NAT网关/NAT实例限制,更加安全。

网络 - 有时,S3 在一个区域中,而计算在另一个区域中。 S3 支持复制https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication.html

也许某种类型的 APM 监控和代码检测可以显示代码也可以优化。

谢谢你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM