簡體   English   中英

如何處理與 nodejs 中的內存分配相關的崩潰?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM