【发布时间】:2018-05-13 06:07:29
【问题描述】:
我运行了超过 500 000 个 uid 以通过承诺 (promiseUserData(uid)) 获取它们的关联数据。由于某种原因,内存使用量没有在循环之间清除。
每个循环使用大约 4mb 的数据,并且不会从内存中清除。
我不知道如何解决这个问题。 Promise pooling 也会导致这个问题。
我们将不胜感激。
谢谢
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,但这似乎没有帮助。
-
如果你在for循环中使用
let而不是var呢? var 是函数作用域,let 是块作用域,可能使用let会清除promises 数组,不知道为什么重新分配它不会清除内存。 -
@HMR 我已经更新了我的代码,只使用 let 和 const 但没有这样的运气。将尝试不同的循环方法。
-
@JamesBarnes 您是否尝试过我在下面的答案中发布的方法?
标签: javascript node.js performance promise