使用node.js的API上传到Amazon S3极慢

时间:2014-09-23 06:52:26

标签: node.js amazon-web-services amazon-s3

试图弄清楚为什么使用putObject命令(node.js库)上传到Amazon S3的速度非常慢。下面的代码读取整个文件目录并异步将它们放到S3。

//Read a directory of files
fs.readdir(dir,function(err,files){

    //Read each file within the folder
    for(var i=0; i < files.length; i++){

    var file = files[i];

    //Read the File
    fs.readFile(path.join(dir,file), function(err, data){

        //Create a new buffer
        var buffer = new Buffer(data, 'base64');

        //Add the pdf to S3 
        s3.putObject({
        'Bucket':bucket,
        'Key':path.join(key,file),
        'Body':buffer,
        'ContentType':mime(file)
        },function(err, data) {

          //Wait for all the other files to be done
          // and perform a callback
        });
    });
    }
});

使用许多不同的文件夹进行测试,结果相似。

  • 6个文件全部在1-2 Kb之间,除了1 @ 63Kb(上传20秒以上)
  • 4个文件全部正好3kb(上传时间超过20秒)

使用AWS web interface上传相同的文件大约需要3秒才能完成(或更少)。为什么使用node.js API这么慢?

根据亚马逊的文档,我甚至尝试产生多个孩子来独立处理每个上传。上传速度没有变化。

2 个答案:

答案 0 :(得分:0)

在Node中创建新的S3实例时,您是否设置了正确的region

例如,您的s3存储桶位于us-east-1中。为了获得最佳的传输速度,您需要确保将S3实例设置为该区域,例如:

const s3 = new AWS.S3({
        accessKeyId: "xxx",
        secretAccessKey: "xxx",
        region: 'us-east-1'
    });

否则,它可能会非常慢。有人可能会因为发生这种情况的特定原因而发出声音--我想这与在执行多部分请求时必须一直查找实际区域有关,或者可能是上载到距离更远的另一个区域您的目的地区域。

答案 1 :(得分:0)

我对上传多个文件有相同的要求,所以我利用Promise功能并行上传文件。

    async function uploadFile(filePath, bucket) {
    
        const fileContent = fs.readFileSync(filePath);
        const params = {
            Bucket: bucket,
            Key: path.basename(filePath),
            Body: fileContent
        };
    
        return await s3.upload(params).promise();
    }
    
    let uploadFilePromise = [];
        
    for (const file of fileList) {
        uploadFilePromise.push(uploadFile(file, bucket));
    }
    await Promise.all(uploadFilePromise);

它大大减少了整个上传时间。