2017-11-29 3 views
3

약속 (promiseUserData (uid))을 통해 관련 데이터를 가져 오기 위해 500 000 이상의 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'을 사용하여 약속 배열을 정리할 것입니다. 왜 할당을 다시 지정하면 메모리가 정리되지 않을지 확신 할 수 없습니다. – 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); 
}