2017-11-29 54 views
3

約500,000のuidを実行して、関連するデータを約束(promiseUserData(uid))で取得します。何らかの理由で、メモリ使用量がループごとにクリアされることはありません。Promise.allメモリリークを待っているループ

ループごとに約4MBのデータが使用され、メモリからはクリアされません。

これを修正する方法としてはわかりません。プロミスプールもこの問題を引き起こします。

助けていただければ幸いです。

は、あなたが一度にすべての反復のための1000年の約束を作成している

for (var i = 0; i <= numPasses; i++) { 
    var subset = uids.splice(0, 1000); 

    var userDataArray = []; 

    var promises = []; 
    subset.map((uid) => { 
     promises.push(promiseUserData(uid).then((userData) => { 
      if (userData) { 
       userDataArray.push(userData); 
      } 
     })); 
    }); 

    await Promise.all(promises).catch((err) => { 
     console.log('Error in Promises.all: ', err); 
    }); 
} 
+1

*メモリから消去されていません* - >どのようにあなたがそれを測定しますか。?どのタイムスパンについて話していますか?どのくらいのメモリが残っていますか? (いくつかのGCが必要な時に世界を止めるだけなので) –

+0

私はこれをmemwatch-nextとprocess.memoryUsage()。heapUsedの両方で測定しました。 このコードはnodejsで実行されていますが、手動でGCを呼び出してもそれは役に立ちません。 –

+0

varの代わりにforループで 'let'を使うとどうなりますか? varは関数スコープで、letはブロックスコープです。おそらく 'let'を使ってpromises配列をクリアしますが、なぜそれを割り当ててもメモリがクリアされないのでしょうか? – HMR

答えて

0

ありがとうございます。

私はあなたが何をしようとしているかは完全にはわかりませんが、Bluebird.map()のようなものを探していると思います。これは、設定された並行性で多くの約束を処理する便利な方法です。すでに約束事をバッチで処理するために、ループ内でスプライスを使用している可能性があります。

このアプローチでは、インストールする必要がありますし、インポートブルーバード:

const userDataArray = []; 
try { 
    await Bluebird.map(uids, async (uid) => { 
    const userData = await promiseUserData(uid); 
    if (userData) { userDataArray.push(userData); } 
    }, { concurrency: 100 }) 
} catch (err) { 
    console.log('Error in Promises.all: ', err); 
} 
関連する問題