【问题标题】:Way to lower memory usage by mongoose when doing querymongoose在查询时降低内存使用的方法
【发布时间】:2015-10-13 01:47:10
【问题描述】:

我正在处理节点后端,试图通过 mongoose 优化对 mongodb 的非常繁重的查询。预期的返回大小相当可观,但由于某种原因,当我发出请求时,节点开始消耗大量内存,例如,单个大请求需要 200mb+。

考虑到大多数情况下返回的大小小于 10mb,这似乎不正确。完成后它也拒绝释放内存,我知道这可能只是 V8 GC 执行其默认行为,但我担心的是单个 find() 请求消耗的大量内存。

我已通过对 find() 调用的测试将其隔离。一旦完成调用,它会执行一些后期处理,然后将数据发送到回调,所有这些都在一个匿名函数中。我尝试使用查询流而不是 model.find(),但它没有显示出真正的改进。

环顾四周没有得到任何回应,所以我会问,有没有已知的方法来减少、控制或优化猫鼬的内存使用?有谁知道为什么一个电话会使用这么多多余的内存?

编辑

根据 Johnny 和 Blakes 的建议,将lean() 与流式混合使用,以及使用 pause 和 resume 极大地改善了运行时和内存使用情况。谢谢!

【问题讨论】:

  • 在处理.stream() 输出时,您是否调用过.pause()?或者实际上您在“数据”事件处理器中执行了哪些操作,那里是否有任何其他队列控制实现?
  • 我不会暂停或恢复通话。在数据中,我所做的只是将文档附加到一个数组上,以便在关闭时通过回调发送。

标签: node.js mongodb memory mongoose


【解决方案1】:

只要您只需要纯 JavaScript 文档而不需要完整的 Mongoose 文档实例,就可以使用 lean 选项进行 Mongoose 查询。这样可以提高性能并减少内存使用量。

model.find().lean().exec(function(err, docs) {...});

您还可以将lean() 与流式传输结果结合使用,这样可以进一步减少内存使用量。

var stream = model.find().lean().stream();

【讨论】:

【解决方案2】:

默认 mongoose .find() 当然会将所有结果作为“数组”返回,因此总是会使用较大结果的内存,所以这就留下了“流”接口。

这里的基本问题是您使用stream 接口(因为它继承自基本节点流)每个数据事件“触发”并且关联的事件处理程序连续执行。

这意味着即使使用“流”,您在事件处理程序中的后续操作也会“堆叠”起来,至少会消耗大量内存,并且如果那里有进一步的异步进程被触发,可能会占用调用堆栈.

因此,您能做的最好的事情就是开始“限制”流处理中的操作。这就像调用.pause() 方法一样简单:

var stream = model.find().stream();   // however you call

stream.on("data",function() {
    // call pause on entry
    stream.pause();

    // do processing
    stream.resume();            // then resume when done
});

所以.pause() 会停止正在发出的流中的事件,这允许事件处理程序中的操作在继续之前完成,这样它们就不会同时出现。

当您的处理代码完成后,您可以直接在块内调用.resume(),如此处所示,或在块内执行的任何异步操作的回调块内。请注意,相同的规则适用于异步操作,并且“all”必须表示完成,然后才能调用 resume。

还有其他可以应用的优化,您最好查看“队列处理”或“异步流控制”可用模块,以帮助您通过一些并行执行获得更高的性能。

但基本上认为.pause() 然后处理和.resume() 继续避免在处理过程中占用大量内存。

此外,请注意您的“输出”,如果为响应构建某些内容,同样尝试再次使用“流”。如果您所做的工作实际上只是在内存中构建另一个变量,那么所有这些都是徒劳的,因此了解这一点会有所帮助。

【讨论】:

  • 这和 JohnnyHK 的回答大大改善了运行时,谢谢!
  • 这为我解决了一个大问题,让我不再“用硬件解决问题”——谢谢!
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多