[英]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
瓶颈可能发生在多个地方:
可以检查其中的每一项。 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.