【问题标题】:Release Mongoose Memory Between Saves在保存之间释放 Mongoose 内存
【发布时间】:2015-08-23 20:19:31
【问题描述】:

我正在使用 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 数组而不必将整个对象保存在内存中或每次都加载它?

【问题讨论】:

    标签: node.js mongodb memory


    【解决方案1】:

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

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

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

    【讨论】:

    • 那个回调是我调试的一部分。哎呀!你说的保存太频繁了。我会解决这个问题并尝试一下您的建议。
    • 看起来update 正是我所需要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 2017-05-01
    • 1970-01-01
    • 2011-05-10
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多