我需要创建一个Zip文件,其中包含位于我的s3存储桶中的文件(视频和图像)。
在使用我下面的代码时,问题是我很快就达到了Lambda的内存限制。
async.eachLimit(files, 10, function(file, next) {
var params = {
Bucket: bucket, // bucket name
Key: file.key
};
s3.getObject(params, function(err, data) {
if (err) {
console.log('file', file.key);
console.log('get image files err',err, err.stack); // an error occurred
} else {
console.log('file', file.key);
zip.file(file.key, data.Body);
next();
}
});
},
function(err) {
if (err) {
console.log('err', err);
} else {
console.log('zip', zip);
content = zip.generateNodeStream({
type: 'nodebuffer',
streamFiles:true
});
var params = {
Bucket: bucket, // name of dest bucket
Key: 'zipped/images.zip',
Body: content
};
s3.upload(params, function(err, data) {
if (err) {
console.log('upload zip to s3 err',err, err.stack); // an error occurred
} else {
console.log(data); // successful response
}
});
}
});
字符串
- 使用Lambda是否可行,或者我应该考虑其他方法?
- 是否可以动态写入压缩的zip文件,从而在一定程度上消除内存问题,或者我需要在压缩之前收集文件?
如果你能帮忙的话,我将不胜感激。
6条答案
按热度按时间gab6jxml1#
好吧,我今天必须这么做而且很有效。直接缓冲区到流,不涉及磁盘。因此,内存或磁盘限制在这里不会成为问题:
字符串
bqjvbblv2#
我根据@iocoker格式化了代码。
主入口
字符串
Zip文件实用程序
型
k3bvogb13#
其他的解决方案对于没有那么多文件(少于~60)是很好的。如果他们处理更多的文件,他们只是退出到没有任何错误。这是因为它们打开了太多的流。
此解决方案的灵感来自https://gist.github.com/amiantos/16bacc9ed742c91151fcf1a41012445e
这是一个可行的解决方案,即使有许多文件(+300)也能很好地工作,并返回一个预签名的URL到包含文件的zip。
主λ:
字符串
辅助函数:
型
6ljaweal4#
使用流可能很棘手,因为我不确定如何将多个流通过管道传输到一个对象中。我已经用标准文件对象做过几次了。这是一个多步骤的过程,而且相当快。请记住,Lambda在Linux中运行,因此您可以使用所有Linux资源,包括system /tmp目录。
1.在/tmp中创建一个子目录,调用“transient”或任何适合您的命令
1.使用s3.getObject()并将文件对象写入/tmp/transient
1.使用GLOB包从/tmp/transient生成路径数组[]
1.循环数组并压缩.addLocalFile(array[i]);
1.“);files.zip
klr1opcd5#
我使用了类似的方法,但我面临的问题是,生成的ZIP文件中的一些文件没有正确的大小(和相应的数据)。这段代码可以管理的文件大小有什么限制吗?在我的情况下,我压缩大文件(几个大于1GB)和数据总量可能达到10 GB。
我没有收到任何错误/警告消息,所以似乎一切正常。
你知道会发生什么吗?
k2fxgqgv6#
您可以使用adm-zip,它允许您直接在磁盘或内存缓冲区中处理zip文件。与node-archiver库相比,它的使用也更简单,node-archiver库也有一个未寻址的issue。
TypeScript代码:
字符串
使用Lambda是否可行,或者我应该考虑其他方法?“是的,有可能。
是否可以动态写入压缩的zip文件,从而在一定程度上消除内存问题,或者我需要在压缩之前收集文件?->是的,请使用上述方法使用
adm-zip
。