Performance Mongodb聚合框架是否比map/reduce更快?

Performance Mongodb聚合框架是否比map/reduce更快?,performance,mongodb,mapreduce,aggregation-framework,Performance,Mongodb,Mapreduce,Aggregation Framework,mongodb 2.2中是否引入了聚合框架,与map/reduce相比有什么特殊的性能改进 如果是,原因、方式和金额 (我已经为自己做了测试,性能几乎相同)我的基准测试: ==数据生成== 用大约350字节轻松生成400万行(使用python)。 每个文档都有以下键: key1,key2(两个随机列用于测试索引,一个基数为2000,另一个基数为20) longdata:用于增加每个文档大小的长字符串 值:用于测试聚合的简单数字(常量10) db=连接('127.0.0.1')。测试#mon

mongodb 2.2中是否引入了聚合框架,与map/reduce相比有什么特殊的性能改进

如果是,原因、方式和金额

(我已经为自己做了测试,性能几乎相同)

我的基准测试:

==数据生成==

用大约350字节轻松生成400万行(使用python)。 每个文档都有以下键:

  • key1,key2(两个随机列用于测试索引,一个基数为2000,另一个基数为20)
  • longdata:用于增加每个文档大小的长字符串
  • 值:用于测试聚合的简单数字(常量10)

db=连接('127.0.0.1')。测试#mongo连接
随机种子(1)
对于范围(2)内的uu:
key1s=[hexlify(os.uradom(10)).decode('ascii')用于范围(10)]
key2s=[hexlify(os.uradom(10)).decode('ascii')用于范围(1000)]
baddata='一些长日期'+'*'*300
对于范围内的i(2000年):
数据列表=[{
“key1”:随机选择(key1s),
“key2”:随机选择(key2s),
“baddata”:baddata,
“值”:10,
}适用于uu范围内(1000)]
对于数据列表中的数据:
db.testtable.save(数据)
mongo中的总数据大小约为6GB。(博士后为2GB)

==测试==

我做了一些测试,但一个测试足以比较结果:

注意:服务器重新启动,并且在每次查询后清理操作系统缓存,以忽略缓存的影响

查询:使用
key1=somevalue
聚合所有行(大约200K行),并对每个
key2
求和
value

  • 映射/减少10.6秒
  • 累计9.7秒
  • 组10.3秒
查询:

映射/减少:

db.testtable.mapReduce(函数(){emit(this.key2,this.value);},函数(key,values){var i=0;values.forEach(函数(v){i+=v;});return i;},{out:{inline:1},查询:{key1:'663969462dc0a5fc34'})

合计:

db.testtable.aggregate({$match:{key1:'663969462DC0A5FC34'},{$group:{{u id:'$key2',pop:{$sum:'$value'}}})

组:


db.testtable.group({key:{key2:1},cond:{key1:'663969462dc02ec0a5fc34'},reduce:function(obj,prev){prev.csum+=obj.value;},initial:{csum:0})
我个人运行的每个测试(包括使用自己的数据)都显示聚合框架比map reduce快数倍,通常要快一个数量级

仅取您发布的数据的十分之一(但不是清除操作系统缓存,而是首先加热缓存-因为我想测量聚合的性能,而不是分页数据所需的时间),我得到了以下结果:

MapReduce:1058ms
聚合框架:133ms

从聚合框架中删除$match和从mapReduce中删除{query:}(因为两者都只使用一个索引,而这不是我们想要测量的),并通过key2对整个数据集进行分组我得到:

MapReduce:18803ms
聚合框架:1535ms


这些与我以前的实验非常一致。

“几乎”相同?有哪些基准?你的话基本上毫无意义。你在比较猫和牛。此外,您知道MR仍然局限于单线程…所以:无意义的问题,因此-1@user1833746这是一个问题,我不想解释我的基准。我想知道这个问题的新答案。请投赞成票,让其他人回答。你看到这个问题(和答案)了吗@Asya是的,请参阅下面我的基准测试请参考此链接以了解更多信息。组不是聚合框架,它是map/reduce的一部分。这就是为什么它有一个reduce函数。在这里可以看到差异:如果您使用的是聚合框架,那么将调用db.collection.aggregate([pipeline])我有一个建议:为什么不执行查询并在整个集合上运行相同的操作,看看性能是否有差异。基准测试的另一个问题是清除了OS缓存?因此,您主要测量将数据分页到RAM所需的时间。这使实际的性能数字相形见绌,而且这不是一个现实的场景。有关此问题的更多评论,请参阅回答感谢您回答问题的第一部分!第二部分呢?为什么和如何?你有什么要补充的吗?感谢您的任何输入。文档中已经介绍了这一点,但简而言之,聚合是在服务器(C++)中本机运行的,MapReduce会生成单独的javascript线程来运行JS代码。 db = Connection('127.0.0.1').test # mongo connection random.seed(1) for _ in range(2): key1s = [hexlify(os.urandom(10)).decode('ascii') for _ in range(10)] key2s = [hexlify(os.urandom(10)).decode('ascii') for _ in range(1000)] baddata = 'some long date ' + '*' * 300 for i in range(2000): data_list = [{ 'key1': random.choice(key1s), 'key2': random.choice(key2s), 'baddata': baddata, 'value': 10, } for _ in range(1000)] for data in data_list: db.testtable.save(data)