【发布时间】: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