[英]how to handle crashes assocaiated with memory allocation in nodejs?
我正在尝试用来自 faker 的一些随机数据填充 mongoDB 数据库。 所以我使用 setInterval 函数一遍又一遍地运行数据库查询,但问题是当我监控我的内存使用情况时,它只会不断增长,直到达到 v8 引擎的限制,无论我增加多少限制它都会崩溃反正只是时间问题。
const faker = require("faker")
let userName;
let email;
setInterval(async () => {
userName = faker.name.findName();
email = faker.internet.email();
await User.create({
userName: userName,
email: email,
})
.then(() => {
//getting memory usage
console.log(process.memoryUsage().heapUsed / 1024 / 1024);
})
.catch(err => {
console.log(err);
});
});
我应该如何管理内存分配以阻止崩溃? 这被认为是内存泄漏吗?
没有时间调用setInterval
,这是尽可能快地添加到回调队列中,没有任何限制。 如果您将项目添加到队列的速度比删除它们的速度快,则内存将始终增长。
*编辑:要准确了解执行setInterval
时事件循环和回调队列会发生什么,我建议观看Philip Roberts和/或Jake Archibald出色的 JSConf 演讲。
你有几个选择。 你可以更改为setTimeout
,然后调用其他setTimeout
在你的.then
,一旦最后一次通话结束。 这基本上会将它序列化。
更细致的方法是使用计数器限制并发 mongoDB 写入的最大数量。 这样你就可以同时进行一定数量的写入。 在此示例中,它将并发写入的数量限制为 10。这应该可以防止您的内存无限制地增长。
const faker = require("faker")
let userName;
let email;
let numRunning = 0;
let maxRunning = 10;
setInterval(async () => {
if (numRunning > maxRunning) return;
numRunning++;
userName = faker.name.findName();
email = faker.internet.email();
await User.create({
userName: createdUser.userName,
age: createdUser.age,
})
.then(() => {
numRunning--;
//getting memory usage
console.log(process.memoryUsage().heapUsed / 1024 / 1024);
})
.catch(err => {
numRunning--;
console.log(err);
});
}, 50);
我还添加了 50ms 的间隔。 setInterval
的零真的不是一个好主意。 有时对setTimeout
使用零是有充分理由的,但我想不出对setInterval
使用零的充分理由。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.