在保存之间释放Mongoose记忆

时间:2015-08-23 20:19:32

标签: node.js mongodb memory

我使用Mongoose来管理MongoDB实例,并且我每隔一段时间就会有数据进入。大约300个不同的对象,大约9个键/值对,每5秒一次。在内存中的模型大小开始严重影响性能之前,一切都会好转几分钟,然后在内存耗尽时最终陷入困境。

我已使用node-inspect检查了该应用,以确认该应用的其他部分没有内存泄漏。它确认包含我的Mongoose模型的持久性模块是使用内存的地方。这是我的保存方法:

function persistCoordinates(id, coordinates, callback) {
  var Usage = this.Usage;
  Usage.findById(id, pushCoordinates);
  callback();

  function pushCoordinates(err, usage) {
    if (err) {
      console.log(err);
      return;
    }
    coordinates.forEach(push);

    function push(element, index, array) {
      if (usage) {
        usage.coordinates.push(element);
        usage.save(saved); // Just logs success. I suspect I need some cleanup.
      }
    }
  }
}

我已经找到了这种清理方法,但是如果我正确理解它,它会完全从内存中移除我的模型并破坏后续的保存。

delete mongoose.models.Usage;
delete mongoose.connection.collections.usages;
delete mongoose.modelSchemas.Usage;

我是否误解了它的作用,如果没有,是否有办法附加到coordinates数组而不必将整个对象保留在内存中或每次都加载它?

1 个答案:

答案 0 :(得分:3)

在不等待任何异步调用完成的情况下调用callback();看起来很可疑,并且您在添加每个元素后调用save而不只是一次。

使用update $push运算符$each替换所有内容会更高效,这样您每次都不会重新加载整个文档:

function persistCoordinates(id, coordinates, callback) {
  this.Usage.update({_id: id}, {$push: {coordinates: {$each: coordinates}}}, callback);
}