C# 如何使用AWS lambda处理大型zip文件?
我想从s3中读取100K+的文件,并将它们压缩成一个大文件。单个文件的大小可以在几Kb到1MB之间,最终的zip文件可以轻松超过3GB。 给定AWS Lambda的内存限制为3GB,目录存储为512MB。使用AWS lambda,您将如何做到这一点?我正在使用.NETCore3 当zip大小超过3Gb时,以下代码将失败C# 如何使用AWS lambda处理大型zip文件?,c#,amazon-s3,.net-core,aws-lambda,aws-sdk-net,C#,Amazon S3,.net Core,Aws Lambda,Aws Sdk Net,我想从s3中读取100K+的文件,并将它们压缩成一个大文件。单个文件的大小可以在几Kb到1MB之间,最终的zip文件可以轻松超过3GB。 给定AWS Lambda的内存限制为3GB,目录存储为512MB。使用AWS lambda,您将如何做到这一点?我正在使用.NETCore3 当zip大小超过3Gb时,以下代码将失败 var zipStream = new MemoryStream(); using (System.IO.Compression.ZipArchive zip =
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);
var zipStream=newmemoryStream();
使用(System.IO.Compression.ZipArchive zip=new ZipArchive(zipStream,ZipArchiveMode.Create,true))
{
对于(inti=0;i,从今天(2020年12月1日)开始,您最多可以分配10GB的内存。这对于您的目的来说已经足够了,至少现在是这样
另一种选择可能是利用Amazon EFS进行存储,前提是您可以调整代码以避免将其全部存储在内存中。EFS对Lambda的支持已于今年早些时候推出。从今天(2020年12月1日)开始,您最多可以分配10 GB的内存。这可能足以满足您的需要,至少目前是这样
另一种选择可能是利用Amazon EFS进行存储,前提是您可以调整代码以避免将其全部存储在内存中。EFS对Lambda的支持已于今年早些时候推出。如果您的总存储空间为3GB(RAM)+0.5GB(磁盘),则显然无法超过3.5GB(可能小于此)。您需要更多空间->AWS lambda不适合此任务您可以在内存不足时使用交换空间,这将使用临时文件代替内存。它运行速度较慢,但可以解决问题。请参阅:@jdweng我认为这仅适用于EC2实例,而不适用于无服务器lambda。不过,我可能是错的。@LP13:如果计算机有文件系统,请参阅m(智能卡)那么它是适用的。与无服务器无关。Lambda是事件驱动的。如果你只做一次,那么用合理的磁盘空间启动EC2最容易,运行程序,并摆脱EC2。如果你需要经常这样做,那么用正确的“东西”创建EC2 AMI如果您的总存储空间为3GB(RAM)+0.5GB(磁盘),则显然无法超过3.5GB(可能小于此值)。您需要更多空间->AWS lambda不适合此任务您可以在内存不足时使用交换空间,这将使用临时文件代替内存。它运行速度较慢,但可以解决问题。请参阅:@jdweng我认为这仅适用于EC2实例,而不适用于无服务器lambda。不过,我可能是错的。@LP13:如果计算机有文件系统,请参阅m(智能卡)那么它是适用的。与无服务器无关。Lambda是事件驱动的。如果你只做一次,那么用合理的磁盘空间启动EC2最容易,运行程序,并摆脱EC2。如果你需要经常这样做,那么用正确的“东西”创建EC2 AMI并使用它创建临时EC2,并根据需要运行它。准时:)准时:)