我正在使用mongodb聚合来从大型集合中对文档进行采样。
https://docs.mongodb.com/manual/reference/operator/aggregation/sample/
连续几次通话后,我看到mongodb的记忆越来越高,在第12次通话后,它因OutOfMemory错误而崩溃。
如何判断Mongodb在处理完查询后释放内存?
答案 0 :(得分:0)
您提出此问题的原因是您不知道$sample
运算符的工作原理。如documentation中所述,
为了得到N个随机文件:
- 的约束
如果N大于或等于集合中文档总数的5%,则$ sample执行集合扫描,执行排序,然后选择前N个文档。因此,$ sample阶段受sort memory restrictions。
如果N小于集合中文档总数的5%, 如果使用WiredTiger存储引擎,$ sample会在集合上使用伪随机光标来对N个文档进行采样。 如果使用MMAPv1存储引擎,$ sample使用_id索引随机选择N个文档。
所以我认为您想要获得的随机文档数量大于5%。您需要的是将allowDiskUse
设置为True
。
collection.aggregate(pipeline, allowDiskUse=True)
答案 1 :(得分:0)
您应将allowDiskUse
值设为true
。例如:
db.books.aggregate( [
{ $group : { _id : "$author", books: { $push: "$title" } } },
{allowDiskUse:true}
] )
管道阶段的RAM限制为100兆字节。如果一个阶段 超过此限制,MongoDB将产生错误。允许的 处理大型数据集时,请使用allowDiskUse选项启用 聚合管道阶段将数据写入临时文件。
您可以阅读有关此here的更多信息。
答案 2 :(得分:-1)
事实证明问题是存储引擎缓存。我使用的是EC2实例,导致OOM错误。我已经能够通过分配较小的缓存大小来解决它:
mongod --dbpath /a/path/to/db --logpath /a/path/to/log --storageEngine wiredTiger --wiredTigerEngineConfigString="cache_size=200M" --fork