Mongodb聚合内存不足

时间:2016-10-08 12:02:29

标签: python mongodb pymongo aggregation-framework

我正在使用mongodb聚合来从大型集合中对文档进行采样。

https://docs.mongodb.com/manual/reference/operator/aggregation/sample/

连续几次通话后,我看到mongodb的记忆越来越高,在第12次通话后,它因OutOfMemory错误而崩溃。

如何判断Mongodb在处理完查询后释放内存?

3 个答案:

答案 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