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);
});
}
*メモリから消去されていません* - >どのようにあなたがそれを測定しますか。?どのタイムスパンについて話していますか?どのくらいのメモリが残っていますか? (いくつかのGCが必要な時に世界を止めるだけなので) –
私はこれをmemwatch-nextとprocess.memoryUsage()。heapUsedの両方で測定しました。 このコードはnodejsで実行されていますが、手動でGCを呼び出してもそれは役に立ちません。 –
varの代わりにforループで 'let'を使うとどうなりますか? varは関数スコープで、letはブロックスコープです。おそらく 'let'を使ってpromises配列をクリアしますが、なぜそれを割り当ててもメモリがクリアされないのでしょうか? – HMR