[英]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.