【发布时间】:2021-03-07 12:56:27
【问题描述】:
我想从 s3 读取 100K+ 文件并将它们压缩成单个大文件。单个文件的大小可以在几 Kb 到 1MB 之间,最终的 zip 文件可以轻松超过 3GB。
鉴于 AWS Lambda 的内存限制为 3GB,tmp 目录存储为 512MB。您将如何使用 AWS lambda 来做到这一点?我正在使用 .Net Core 3
当 zip 大小超过 3Gb 时,下面的代码将失败
var zipStream = new MemoryStream();
using (System.IO.Compression.ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true))
{
for(int i =0;i<sourceFils.Count;i++)
{
var zipItem = zip.CreateEntry("file"+i.ToString()+".pdf");
using (var entryStream = zipItem.Open())
{
var source = GetFileFromS3(sourceFiles[i]);
await source.CopyToAsync(entryStream);
}
}
}
//upload zip file to S3. For brevity Upload code is not included.
_s3Client.Upload(zipStream);
我见过的大多数用于处理大文件的示例都使用 Node JS,并且也不超过 3GB。我正在寻找 C# .Net Core 示例。此外,我试图避免将 zip 拆分为多个小于 3GB 的 zip 文件
1>在不拆分 zip 文件的情况下,您将如何使用 AWS Lambda 执行此操作? 2>是否有可以直接从 S3 读取/写入的 S3 Stream?
【问题讨论】:
-
如果你的总存储空间为 3GB (RAM) + 0.5GB (disk),你显然不能超过 3.5GB(而且可能会小于这个)。您需要更多空间 -> AWS lambda 不适合此任务
-
您可以在内存不足时使用交换空间,这将使用临时文件代替内存。它运行速度较慢,但会解决问题。请参阅:reddit.com/r/aws/comments/b2zijf/…
-
@jdweng 我认为这仅适用于 EC2 实例,不适用于无服务器 lambda。不过我可能是错的。
-
@LP13 :如果机器有文件系统(智能卡),那么它是适用的。与无服务器无关。
-
Lambda 是事件驱动的。如果您这样做一次,那么启动具有合理磁盘空间量的 EC2、运行程序并摆脱 EC2 将是最简单的。如果您需要经常执行此操作,则使用正确的“材料”创建一个 EC2 AMI,并使用它来创建一个临时 EC2 并根据需要运行它。
标签: c# amazon-s3 .net-core aws-lambda aws-sdk-net