Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – 使用lambda函数解压缩S3中的档案真的很懒散大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我的公司正在将大型存档文件上传到S3,现在希望它们在S3上解压缩.我写了一个基于解压缩的lambda函数,由一个文件到达xxx-zip存储桶触发,它从S3流式传输zip文件,解压缩流,然后将各个文件流式传输到xxx-data存储桶.

它可以工作,但我发现它比我预期的要慢得多 – 即使在测试文件,zip大小约为500k并且保存大约500个文件,这是超时设置60秒的超时.这看起来是对的吗?在使用节点运行的本地系统上,它比这更快.在我看来,由于文件正在亚马逊的云中移动,因此延迟应该很短,并且由于文件正在流式传输,因此实际花费的时间应该是解压缩流所花费的时间.

有没有一个固有的原因,为什么这不起作用,或者我的代码中有什么东西导致它这么慢?这是我第一次使用Node.js,所以我可能会做得很糟糕.或者,有没有更好的方法来做到谷歌找不到的?

下面是代码的概述(BufferStream是我编写的一个类,它将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 @R_72_10586@l = 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) {
                @R_72_10586@L++;
                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},{},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,' + @R_72_10586@l + ' files processed,' + successful + ' written to S3,' + errors + ' Failed');
            context.done(null,'');
        }
    });
}

解决方法

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

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

如果您选择坚持使用拉链,您可以联系亚马逊支持并要求增加lambda功能的60秒限制.

大佬总结

以上是大佬教程为你收集整理的node.js – 使用lambda函数解压缩S3中的档案真的很懒散全部内容,希望文章能够帮你解决node.js – 使用lambda函数解压缩S3中的档案真的很懒散所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。