2017-11-15 3 views
0

Amazon S3バケットにアップロードするファイルのURLの配列があります。配列に2916のURLがあり、ファイルの合計サイズは361MBです。Node.jsのamazon S3へのリモートファイルのストリーム配列

ストリームを使用してこれを達成しようとすると、あまりにも多くのメモリを使用しないようにします。私のソリューションは、すべての2916ファイルがアップロードされるという意味で機能しますが、アップロードされたファイルの合計サイズは実行ごとに200MBから361MBまで異なるため、(少なくとも一部の)アップロードは不完全であるようです。

// Relevant code below (part of a larger function) 

/* Used dependencies and setup: 
const request = require('request'); 
const AWS = require('aws-sdk'); 
const stream = require('stream'); 
AWS.config.loadFromPath('config.json'); 
const s3 = new AWS.S3(); 
*/ 

function uploadStream(path, resolve) { 
    const pass = new stream.PassThrough(); 
    const params = { Bucket: 'xxx', Key: path, Body: pass }; 
    s3.upload(params, (err, data) => resolve()); 
    return pass; 
} 

function saveAssets(basePath, assets) { 
    const promises = []; 
    assets.map(a => { 
     const url = a.$.url; 
     const key = a.$.path.substr(1); 
     const localPromise = new Promise(
     (res, rej) => request.get(url).pipe(uploadStream(key, res)) 
    ); 
     promises.push(localPromise); 
    }); 
    return Promise.all(promises); 
} 

saveAssets(basePath, assets).then(() => console.log("Done!")); 

〜25秒後に(それは「やった!」を書き込むことは約束と少し厄介だが、私はすべてのファイルがアップロードされた際に伝えることができる必要があり、この部分は、少なくともうまく動作するようですすべての約束が解決されたとき)。

私はストリームに新しいので、私がこれを間違った方法で近づけば自由に感じてください;-)本当に私はいくつかのポインタを得ることができますように!

答えて

0

私は一度に多くのリクエストを完了しようとしていたようです。 async.eachLimitを使用すると、実行時間、メモリー消費量、安定性のトレードオフの点で私のコードは最大50個の同時リクエストに制限されます(すべてのダウンロードが毎回完了します)。

関連する問題