Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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 如何处理大型对象并避免内存不足错误?_Javascript_Node.js_Mongoose - Fatal编程技术网

Javascript 如何处理大型对象并避免内存不足错误?

Javascript 如何处理大型对象并避免内存不足错误?,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我正在尝试处理一个大数组,但对象有时太大,以致于服务器崩溃: 致命错误:调用和重试上次分配失败-处理内存不足 我可以通过执行节点--max old space size=100然后运行我的进程,在本地复制这个过程。如果不设置此选项,它可以正常工作 这是代码的一部分,它正在中断 function setManagers(json){ return Q.all(json.map(function(obj){ return getUserByUsername(obj.username)

我正在尝试处理一个大数组,但对象有时太大,以致于服务器崩溃:

致命错误:调用和重试上次分配失败-处理内存不足

我可以通过执行
节点--max old space size=100
然后运行我的进程,在本地复制这个过程。如果不设置此选项,它可以正常工作

这是代码的一部分,它正在中断

function setManagers(json){
return Q.all(json.map(function(obj){
    return getUserByUsername(obj.username)
    .then(function(user){
        console.log('got here'); //never hits
        ...

我认为这个问题是因为它是一个巨大的数组,长度超过5000

如果我删除限制内存的选项,或者使用更小的数据集,它会起作用


有什么简单的方法可以避免这个错误吗?

问题是您同时进行了太多的数据库调用

我会改变你的逻辑,把所有用户名都用逗号连接起来的排序字符串发送到数据库,我会立刻得到所有需要的用户。然后,我将遍历这些用户,并对从数据库接收到的用户执行任何操作


另一种解决方案(不会妨碍您当前的逻辑)是逐个执行数据库操作,例如,使用promise,同时:

function pwhile(condition, body) {
  var done = Q.defer();

  function loop() {
    if (!condition())
      return done.resolve();
    Q.when(body(), loop, done.reject);
  }

  Q.nextTick(loop);

  return done.promise;
}

function setManagers(json) {
  var i = 0;
  return pwhile(function() { i < json.length; }, function() {
    var p = getUserByUsername(json[i].username);
    i++;
    return p;
  });
}
功能时(状态、主体){
var done=Q.defer();
函数循环(){
如果(!条件())
返回done.resolve();
Q.when(body(),循环,done.reject);
}
Q.nextTick(循环);
回报完成。承诺;
}
函数集管理器(json){
var i=0;
返回pwhile(function(){i
一个显而易见的解决方案是通过某种分块或批处理来减小数组的大小,对吗?将数组保存到文件中,当您需要打开文件并逐行读取时,这将是一个解决方案。我不认为数组的大小是真正的问题,而是数组中的每个元素,您正在执行数据库查询。这实际上应该通过一个查询或几个查询来完成,而不是同时进行5000个查询。5000个元素听起来并不多。
function pwhile(condition, body) {
  var done = Q.defer();

  function loop() {
    if (!condition())
      return done.resolve();
    Q.when(body(), loop, done.reject);
  }

  Q.nextTick(loop);

  return done.promise;
}

function setManagers(json) {
  var i = 0;
  return pwhile(function() { i < json.length; }, function() {
    var p = getUserByUsername(json[i].username);
    i++;
    return p;
  });
}