Javascript 如何处理nodejs中与内存分配相关的崩溃?
我试图用faker提供的一些随机数据填充mongoDB数据库。因此,我使用setInterval函数反复运行数据库查询,但问题是,当我监控内存使用情况时,它会不断增长,直到达到v8引擎的限制,无论我增加多少限制,它都会崩溃,只是时间问题Javascript 如何处理nodejs中与内存分配相关的崩溃?,javascript,node.js,memory-management,memory-leaks,setinterval,Javascript,Node.js,Memory Management,Memory Leaks,Setinterval,我试图用faker提供的一些随机数据填充mongoDB数据库。因此,我使用setInterval函数反复运行数据库查询,但问题是,当我监控内存使用情况时,它会不断增长,直到达到v8引擎的限制,无论我增加多少限制,它都会崩溃,只是时间问题 const faker = require("faker") let userName; let email; setInterval(async () => { userName = faker.name.findName(); emai
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
时事件循环和回调队列会发生什么,我建议通过and/or观看优秀的JSConf对话
你有几个选择。您可以更改为一个setTimeout
,然后在中调用另一个setTimeout
。然后在最后一次调用完成后调用另一个setTimeout
。这将从本质上序列化它
更微妙的方法是通过使用计数器限制并发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);
我还增加了50毫秒的间隔。将setInterval
设为零确实不是一个好主意。有时有很好的理由将零用于setTimeout
,但我想不出有什么好的理由将零用于setInterval
谢谢@David784是的,我对setInterval的实际工作方式有误解