gpt4 book ai didi

MongoDB 聚合和 MapReduce 一样慢?

转载 作者:IT老高 更新时间:2023-10-28 13:21:23 31 4
gpt4 key购买 nike

我刚开始使用 mongo db 并尝试做一些简单的事情。我用包含“item”属性的数据集合填充了我的数据库。我想尝试计算每个项目在集合中的时间

文档示例:

{ "_id" : ObjectId("50dadc38bbd7591082d920f0"), "item" : "Pons", "lines" : 37 }

所以我设计了这两个函数来做 MapReduce(使用 pymongo 用 python 编写)

all_map = Code("function () {"
" emit(this.item, 1);"
"}")

all_reduce = Code("function (key, values) {"
" var sum = 0;"
" values.forEach(function(value){"
" sum += value;"
" });"
" return sum;"
"}")

这就像一个魅力,所以我开始填充收藏。在大约 30.000 个文档中,mapreduce 已经持续了超过一秒...因为 NoSQL 吹嘘速度,我想我一定是做错了某些事情!

Stack Overflow 上的一个问题让我查看了 mongodb 的聚合功能。所以我尝试使用 group + sum + sort thingies。想出了这个:

db.wikipedia.aggregate(
{ $group: { _id: "$item", count: { $sum: 1 } } },
{ $sort: {count: 1} }
)

这段代码工作得很好,给我的结果与 mapreduce 集相同,但它同样慢。难道我做错了什么?我真的需要使用 hadoop 等其他工具来获得更好的性能吗?

最佳答案

我会给出一个基本上总结我的评论的答案。我不能代表 Hadoop 等其他技术,因为我还没有找到时间使用它们的乐趣,但我可以代表 MongoDB。

不幸的是,您对任何数据库都使用了两个最差的运算符:计算字段和全表扫描上的分组(或不同)。在这种情况下,聚合框架必须计算字段、组,然后在内存中 (http://docs.mongodb.org/manual/reference/aggregation/#_S_sort) 对计算字段进行排序。对于 MongoDB 来说,这是一项效率极低的任务,实际上很可能是任何数据库。

没有简单的方法可以根据您自己的应用程序实时执行此操作。如果您不需要立即返回结果,则 Map reduce 可能是一种出路,但由于我猜您真的不想等待这种东西,因此默认方法只是完全消除该组。

您可以通过预聚合来做到这一点。因此,您可以创建另一个 grouped_wikipedia 集合,并在您的应用程序中使用带有 $set 等原子运算符的 upsert() 来管理它>$inc(计算出现次数)以确保每个 item 只获得一行。这可能是解决这个问题的最明智的方法。

然而,这确实引发了另一个问题,即必须与详细集合 wikipedia 一起管理这个额外的集合,但我相信这是在此处获得正确性能的不可避免的副作用。 yield 将大于必须管理额外收藏的损失。

关于MongoDB 聚合和 MapReduce 一样慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14053094/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com