【问题标题】:Aggregation-framework: optimization聚合框架:优化
【发布时间】:2014-12-14 18:22:13
【问题描述】:

我有这样的文档结构

{
    id, 
    companyid,
    fieldA1, 
    valueA1, 
    fieldA2, 
    valueA2,
    .....

    fieldB15, 
    valueB15,

   fieldF150
   valueF150    
}

我的工作是将 fieldA1*valueA1 、 fieldA2*valueA2 相乘并将其相加为新字段 A_sum = sum(a fields * a values)、B_sum = sum(b fields * b value)、C_sum 等 然后在下一步中我必须生成 final_sum = ( A_sumA_val + B_SumB_val .....)

我已经建模为使用聚合框架和 3 个预测来进行三个计算步骤 - 现在我得到了大约 100 秒的 750.000 个文档,我只有在 _id 上的索引,这是一个 GUID。 CPU 为 15%

我尝试分组以强制并行操作并加载更多 CPU,但似乎赌注更长。 我还能做些什么来让它更快,意味着我要加载更多的 cpu,使用更多的并行性?

我不需要匹配,因为我必须处理所有文档。

【问题讨论】:

  • 我真的怀疑你能否加快速度,因为你基本上必须扫描所有文档。
  • 算一算,这意味着每次扫描只需要 133 微秒 - 包括查找时间、读取和通过管道放置文档。 SSD 的“寻道时间”大约为 50-100 微秒。这将留下 33-83 微秒来读取和处理数据。
  • 而且你不能使用索引查询,如the docs state:“即使管道使用索引,聚合仍然需要访问实际文档;即索引不能完全覆盖聚合管道。”

标签: mongodb aggregation-framework


【解决方案1】:

您可以使用sharding 完成它,因为文档的扫描将并行完成。

只需测量您现在聚合所需的时间,并计算您需要使用的分片数

((t/100)+1)*s

其中 t 是以秒为单位的聚合时间,s 是现有分片的数量(如果您有独立集或副本集,则为 1),当然是向上取整。添加 1 是为了确保在分片环境中进行聚合的开销被附加分片所利用。

【讨论】:

    【解决方案2】:

    我唯一的解决方案是使用并行库将集合拆分为更小的集合(毕竟相同的空间)和每个更小的集合的命令计算(通过 c# 控制台行),这样我就可以将 CPU 提高到 70%。 这将时间从 aprox 395s、15%CPU(通过 robomongo 编写的脚本,所有文档)减少到 25-28s、65-70%cpu(具有并行性的 c# 控制台应用程序)

    在我的情况下,使用分组没有帮助。 分片现在不是一种选择。

    【讨论】:

      猜你喜欢
      • 2013-11-04
      • 2014-05-04
      • 2018-02-18
      • 1970-01-01
      • 2021-12-17
      • 2010-12-18
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多