首页 文章

Mongodb聚合内存不足

提问于
浏览
1

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

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

连续几次打电话后,我看到mongodb的记忆力上升了,在第12次呼叫后,它突然出现OutOfMemory错误 .

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

3 回答

  • 0

    你问这个的原因是因为你不知道$sample运算符是如何工作的 . 如documentation中所述,

    为了获得N个随机文档:如果N大于或等于集合中文档总数的5%,则$ sample执行集合扫描,执行排序,然后选择前N个文档 . 因此,$ sample阶段受排序内存限制 . 如果N小于集合中文档总数的5%,如果使用WiredTiger存储引擎,$ sample将使用伪随机光标对集合进行N个文档的采样 . 如果使用MMAPv1存储引擎,$ sample使用_id索引随机选择N个文档 .

    所以我认为您想要获得的随机文档数量大于5% . 你需要的是将 allowDiskUse 设置为 True .

    collection.aggregate(pipeline, allowDiskUse=True)
    
  • -1

    您应该将 allowDiskUse 值设置为 true . 例如:

    db.books.aggregate( [
               { $group : { _id : "$author", books: { $push: "$title" } } },
                          {allowDiskUse:true}
                      ] )
    

    管道阶段的RAM限制为100兆字节 . 如果某个阶段超过此限制,MongoDB将产生错误 . 要允许处理大型数据集,请使用allowDiskUse选项启用聚合管道阶段以将数据写入临时文件 .

    你可以阅读更多关于这个here的信息 .

  • 0

    事实证明问题是存储引擎缓存 . 我正在使用EC2实例,导致OOM错误 . 我已经能够通过分配如下的较小缓存大小来解决它:

    mongod --dbpath /a/path/to/db --logpath /a/path/to/log --storageEngine wiredTiger --wiredTigerEngineConfigString="cache_size=200M" --fork
    

相关问题