如何分组超过20000个唯一键?

时间:2012-01-06 20:35:57

标签: mongodb pymongo

我有两个例子:

results = coll.group( key={"ip": 1, "id" : 1 }, condition= {}, initial={},
reduce="function(obj,prev) {}" )
print len(results)

map = Code(
"function () {"
"emit({ id: this.id, ip: this.ip}, {count: 1});"
"}"
)

reduce = Code("function (key, values) {""}")
result = coll.map_reduce(map, reduce, "map_reduce_example")
print result.count()

为什么第二个例子比第一个慢?我想使用2个示例而不是1个示例,因为1个示例不适用于超过20000个uniq密钥。

2 个答案:

答案 0 :(得分:3)

MongoDB的new aggregation framework可能会解决您的问题,但在此之前我建议将map / reduce作为定期安排的后台作业运行,并实时查询map / reduce产生的集合 。这样可以更快地获得分组计数结果,但计数可能会略微过时(取决于上次背景地图缩小的时间。)


<强> 说明:

MongoDB的map / reduce比group()慢得多,原因如下:

  • 中间转换:BSON - &gt; JSON - &gt; BSON - &gt; JSON - &gt; BSON(MongoDB以二进制BSON存储数据,但JavaScript map()和reduce()需要输入文本JSON)
  • Javascript函数map()和reduce()必须由单线程JavaScript引擎
  • 解释

MongoDB的本机C聚合功能要快得多,但其中一个限制是所有输出必须适合单个BSON文档(目前为16MB)。这就是为什么数量有限制的原因独特的钥匙。

MongoDB的聚合框架将结合两种方法的优点:

  • 速度的原生执行
  • 没有与JSON进行BSON转换
  • 可以绕过单个文档设置的限制将结果发送到集合。

该框架已经documentedavailable in development versions of MongoDB。该框架计划于2012年2月发布。

答案 1 :(得分:1)

当你运行map / reduce时,你的mapreduce函数在javascript运行时执行(比本机C ++代码慢)。这也涉及一些锁定(JS锁,读锁,写锁)。

另一方面,

group可能会更有效地执行(更多的本机代码,更少的锁等)。

请注意,在分片环境中,map / reduce是您现在唯一的选择(在将来的版本中,您将能够使用聚合框架)。