试图弄清楚为什么使用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
});
});
}
});
使用许多不同的文件夹进行测试,结果相似。
使用AWS web interface上传相同的文件大约需要3秒才能完成(或更少)。为什么使用node.js API这么慢?
根据亚马逊的文档,我甚至尝试产生多个孩子来独立处理每个上传。上传速度没有变化。
答案 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);
它大大减少了整个上传时间。