【问题标题】:What can be done with Mongo Aggregation / Performance of Mongo AggregationMongodb聚合可以做什么/Mongodb聚合的性能
【发布时间】:2013-01-10 10:33:07
【问题描述】:

我构建了一个 MongoDB。我想通过某些分组进行聚合。我找到了这个document,它将为我做到这一点。一切正常,但指出某些limitations

  1. 管道的输出只能包含 16 兆字节。如果你的结果 set 超过此限制,聚合命令会产生错误。

  2. 如果任何单个聚合操作消耗超过 10% 系统 RAM 操作会产生错误。

  3. 聚合系统当前将$group操作存储在内存中, 这在处理大量组时可能会导致问题。

我可以使用 MongoDB 聚合处理多少行/文档?我害怕使用这个。有人可以指导我吗?

【问题讨论】:

  • +1 用于 API 链接和限制摘要。

标签: mongodb mongodb-php


【解决方案1】:

我从 google 群组中得到了有效且有用的答案。想和大家分享一下。

限制不在于文档数量:限制在于最终结果(或中间结果)使用的内存量。

所以:如果您聚合 200 000 个文档,但结果适合 16MB 的结果,那么您就可以了。如果您聚合 100 个文档并且结果不适合 16 MB,那么您将收到错误消息。

同样,如果您对中间结果执行 sort() 或 group(),并且该操作需要超过 10% 的可用 RAM,那么您将收到错误。这仅与您拥有多少文档松散相关:它取决于管道的特定阶段有多大。

我可以通过任何设置增加 16MB 吗?

是 16MB 的限制仅适用于最终结果还是那个特定的 聚合(意味着,中间结果+任何临时持有量+ 最终结果)?

16MB 限制不可调整。这是 MongoDB 中文档的最大大小。由于聚合框架目前是作为命令实现的,因此聚合的结果必须在单个文档中返回:因此有 16 MB 的限制。

看到这个post

【讨论】:

【解决方案2】:

聚合框架可能发生的处理量取决于您的架构。

聚合框架目前只能输出一个文档的相对值(更大的输出你会想看:https://jira.mongodb.org/browse/SERVER-3253),它会以如下形式输出:

{
    result: { //the result },
    ok: 1/0
}

因此,您必须确保从您的$group/$project 返回的内容不会太大,以至于您无法获得所需的结果。大多数情况下情况并非如此,即使在数百万行上,一个简单的$group 也可能导致小于 16Meg 的响应。

我们不知道您的文档大小或您希望运行的聚合查询,因此我们无法提供建议。

如果任何单个聚合操作消耗超过 10% 的系统 RAM,则该操作将产生错误。

这真的很不言自明。如果一个操作的工作集太大以至于占用超过 10% 的 RAM($group/Computed fields/$sort on computed or grouped fields),那么它将无法工作。

除非您尝试滥用聚合框架来为您执行应用逻辑,否则您永远不会真正遇到这个问题。

聚合系统目前将$group操作存储在内存中,在处理大量组时可能会出现问题。

由于$group 真的很难不在内存中执行(它“分组”该字段),这意味着对该组的操作也在内存中,即$sort 这是您可以开始用完这 10 个的地方% 如果你不小心的话。

【讨论】:

  • 如果我有 400 万个文档,如果我像这样进行简单的聚合 >>>db.store.aggregate({$group: {_id: "$SO", total: {$sum: "$net"}}});它会导致任何性能问题吗?它可能会产生 250 个组。
  • @user10 嗯很难说,我可以说聚合框架可以在那个集合上工作,但很难说你会得到什么基准
猜你喜欢
  • 2015-02-17
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多