【问题标题】:Mongodb aggregate out of memoryMongoDB聚合内存不足
【发布时间】:2019-09-05 04:57:12
【问题描述】:

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

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

连续几次调用后,我看到mongodb的内存在攀升,大约在第12次调用后,它崩溃并出现OutOfMemory错误。

如何告诉 Mongodb 在处理完查询后释放内存?

【问题讨论】:

  • 查看字段索引,或阅读 mongolog 获取 COLSCAN 信息

标签: python mongodb pymongo aggregation-framework


【解决方案1】:

您之所以问这个问题是因为您不知道$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)

【讨论】:

  • 谢谢,我试过了,但问题出在文件系统缓存大小,默认设置为太大。
【解决方案2】:

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

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

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

您可以阅读有关此here 的更多信息。

【讨论】:

    【解决方案3】:

    原来问题出在存储引擎缓存上。我正在使用 EC2 实例,它导致那里出现 OOM 错误。我已经能够通过像这样分配更小的缓存大小来解决它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多