聚合框架:优化

时间:2014-10-19 19:12:50

标签: mongodb aggregation-framework

我有这样的文档结构

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

    fieldB15, 
    valueB15,

   fieldF150
   valueF150    
}

我的工作是将fieldA1 * valueA1,fieldA2 * valueA2相乘并将其加到新字段A_sum = sum(字段* a值),B_sum = sum(b字段* b值),C_sum等 然后在下一步我必须生成final_sum =(A_sum A_val + B_Sum B_val .....)

我已经建模使用聚合框架,其中有3个投影用于计算的三个步骤 - 现在在这一点上,对于750.000个文档,我得到大约100秒,我只在_id上有索引,这是一个GUID。 CPU为15%

我试图分组以强制并行操作并加载更多的cpu但看起来更长时间。 我还能做些什么来加快速度,这意味着我可以加载更多的cpu,使用更多的paralelism?

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

2 个答案:

答案 0 :(得分:0)

您可以使用sharding完成此操作,因为文档扫描将并行完成。

只需测量您的聚合现在所需的时间,并使用

计算所需的分片数量
((t/100)+1)*s

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

答案 1 :(得分:0)

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

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