我正在节点后端上尝试通过mongoose优化对mongodb的非常繁重的查询。预期的返回大小是相当大的,但是由于某种原因,当我发出请求时,节点开始消耗大量内存,例如单个大请求的内存为200mb +。
考虑到返回的大小在大多数情况下小于10mb,这似乎是不对的。它也拒绝在完成后释放内存,我知道这可能只是V8 GC在执行其默认行为,但是让我担心的是,单个find()请求占用了大量内存。
我已通过测试到find()调用将其隔离。调用完成后,它会执行一些后处理,然后将数据发送到回调,所有这些操作都在匿名函数中。我尝试使用querystream代替model.find(),但是它没有显示出任何实际的改进。
环顾四周并没有产生任何响应,所以我想问一下,有没有一种已知的方法来减少,控制或优化猫鼬的内存使用?有谁知道为什么一个电话要使用这么多的多余内存?
编辑
根据Johnny和Blakes的建议,将lean()与流混合使用,以及使用暂停和恢复功能极大地改善了运行时和内存使用率。谢谢!
您可以使用lean选项进行Mongoose查询,只要您只需要纯JavaScript文档而不需要完整的Mongoose文档实例即可。这样可以提高性能并减少内存使用。
model.find().lean().exec(function(err, docs) {...});
您还可以将lean()结果与流式传输相结合,这将进一步减少内存使用量。
lean()
var stream = model.find().lean().stream();