Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何处理nodejs中与内存分配相关的崩溃?_Javascript_Node.js_Memory Management_Memory Leaks_Setinterval - Fatal编程技术网

Javascript 如何处理nodejs中与内存分配相关的崩溃?

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

我试图用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
时事件循环和回调队列会发生什么,我建议通过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的实际工作方式有误解