使用lambda函数在S3中解压缩文件真的很慢

我的公司正在上传大档案文件到S3,现在想要他们在S3上解压缩。 我写了一个基于unzip的lambda函数,由文件到达xxx-zip存储区触发,它从S3stream解压缩文件,解压缩stream,然后将单个文件stream式传输到xxx数据存储区。

它可以工作,但是我发现它比我预期的要慢得多 – 即使在一个testing文件中,zip大小约为500k,并且保存了大约500个文件,但是超时设置为60秒。 这看起来正确吗? 在我的本地系统运行节点比这更快。 在我看来,由于文件被转移到亚马逊的云延迟应该是短暂的,并且由于文件正在stream,实际所花费的时间应该是解压缩stream的时间。

有没有一个固有的原因,为什么这将无法正常工作,或者有我的代码中的东西造成它如此之慢? 这是我第一次使用node.js,所以我可能会做一些不好的事情。 或者有没有更好的方法来做到这一点,我无法find谷歌?

下面是代码的概要( BufferStream是我写的一个类, s3.getObject()s3.getObject()返回的Buffer包装到readStream

 var aws = require('aws-sdk'); var s3 = new aws.S3({apiVersion: '2006-03-01'}); var unzip = require('unzip'); var stream = require('stream'); var util = require( "util" ); var fs = require('fs'); exports.handler = function(event, context) { var zipfile = event.Records[0].s3.object.key; s3.getObject({Bucket:SOURCE_BUCKET, Key:zipfile}, function(err, data) { var errors = 0; var total = 0; var successful = 0; var active = 0; if (err) { console.log('error: ' + err); } else { console.log('Received zip file ' + zipfile); new BufferStream(data.Body) .pipe(unzip.Parse()).on('entry', function(entry) { total++; var filename = entry.path; var in_process = ' (' + ++active + ' in process)'; console.log('extracting ' + entry.type + ' ' + filename + in_process ); s3.upload({Bucket:DEST_BUCKET, Key: filename, Body: entry}, {}, function(err, data) { var remaining = ' (' + --active + ' remaining)'; if (err) { // if for any reason the file is not read discard it errors++ console.log('Error pushing ' + filename + ' to S3' + remaining + ': ' + err); entry.autodrain(); } else { successful++; console.log('successfully wrote ' + filename + ' to S3' + remaining); } }); }); console.log('Completed, ' + total + ' files processed, ' + successful + ' written to S3, ' + errors + ' failed'); context.done(null, ''); } }); } 

我怀疑你正在使用的解压缩模块是一个JavaScript实现,它允许你解压缩zip文件 – 这是非常缓慢的。

我build议使用gzip压缩文件,并使用C编译的内部zlib库,并应提供更好的性能。

如果你select坚持使用zip,你可以联系亚马逊的支持,并要求增加你的lambda函数60秒的限制。