使用Mongo Aggregation / Mongo聚合的性能可以做些什么

时间:2013-01-10 10:33:08

标签: mongodb mongodb-php

我构建了一个MongoDB。我想通过某些分组进行聚合。我找到了document,这对我来说就是这样。一切都很好,但指出了某些limitations

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

  2. 如果任何单个聚合操作占用的比例超过10% 系统RAM操作将产生错误。

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

  4. 我可以使用MongoDB聚合处理多少行/文档?我不敢用这个。任何人都可以指导我吗?

2 个答案:

答案 0 :(得分:16)

我从谷歌小组获得了有效且有用的答案。想与大家分享。

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

所以:如果你汇总了20万份文件,但结果符合16MB的结果,那你就没事了。如果您聚合100个文档并且结果不适合16 MB,那么您将收到错误。

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

  

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

     

仅对最终结果是16MB限制还是针对该特定结果   汇总(均值,中间结果+任何临时持股+   最终结果)?

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

请参阅此post

答案 1 :(得分:1)

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

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

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

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

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

  

如果任何单个聚合操作占用系统RAM的10%以上,操作将产生错误。

这真的很自我解释。如果某个操作的工作集太大,以至于计算或分组字段的RAM($group /计算字段/ $sort)超过10%,那么它将无效。

除非您尝试滥用聚合框架为您执行应用程序逻辑,否则您应该永远不会遇到此问题。

  

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

由于$group在内存中真的很难做到(它会“强调”字段),这意味着该组上的操作也在内存中,即$sort这是你可以开始的地方如果不小心,可以用掉10%。

相关问题