Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在S3中使用lambda函数解压归档文件真是太慢了_Node.js_Amazon Web Services_Amazon S3_Aws Lambda - Fatal编程技术网

Node.js 在S3中使用lambda函数解压归档文件真是太慢了

Node.js 在S3中使用lambda函数解压归档文件真是太慢了,node.js,amazon-web-services,amazon-s3,aws-lambda,Node.js,Amazon Web Services,Amazon S3,Aws Lambda,我的公司正在将大型存档文件上传到S3,现在希望它们在S3上解压缩。我编写了一个基于解压的lambda函数,由到达xxx zip bucket的文件触发,该函数将zip文件从S3流式传输,解压流,然后将各个文件流式传输到xxx数据bucket 它可以工作,但我发现它比我预期的慢得多-即使是在一个测试文件上,zip大小约500k,容纳约500个文件,这是一个设置了60秒超时的超时。这看起来对吗?在使用node运行的本地系统上,速度比这快。在我看来,由于文件在Amazon的云内移动,延迟应该很短,而且

我的公司正在将大型存档文件上传到S3,现在希望它们在S3上解压缩。我编写了一个基于解压的lambda函数,由到达xxx zip bucket的文件触发,该函数将zip文件从S3流式传输,解压流,然后将各个文件流式传输到xxx数据bucket

它可以工作,但我发现它比我预期的慢得多-即使是在一个测试文件上,zip大小约500k,容纳约500个文件,这是一个设置了60秒超时的超时。这看起来对吗?在使用node运行的本地系统上,速度比这快。在我看来,由于文件在Amazon的云内移动,延迟应该很短,而且由于文件正在流式传输,实际所用的时间应该大约是解压流所需的时间

这不起作用是有内在原因吗,还是我的代码中有什么东西导致它如此缓慢?这是我第一次使用node.js,所以我可能会做得很糟糕。或者有没有更好的方法可以做到这一点,这是我在谷歌上找不到的

下面是代码的概要(
BufferStream
是我编写的一个类,它将
s3.getObject()
返回的缓冲区包装成
readStream


我怀疑您使用的解压模块是一个JavaScript实现,它允许您解压文件,这非常慢

我建议使用gzip压缩文件 并且使用C编译的内部库应该提供更好的性能


如果您选择使用zip,您可以联系亚马逊支持部门,要求提高lambda功能的60秒限制。

谢谢您的建议。我试图用zlib来比较时间,但是在上传到S3()时遇到了问题。在进行了更多的测量之后,我发现导致问题的是文件的大小,而不是数量。如果存档文件包含5MB的文本文件,那么它本身就占用了大部分时间。看来这不是正确的方法。我将把它写在来自SQS的EC2轮询上。
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, '');
        }
    });
}