gpt4 book ai didi

mongodb - 如何使用动态组优化缓慢的 Mongo MapReduce

转载 作者:行者123 更新时间:2023-11-29 13:59:51 25 4
gpt4 key购买 nike

我是 mongo 的新手,但对关系数据库有丰富的经验。

我在地点 举办了大约 85000 个事件,每个事件都有相关的权重。对于热图,我现在需要对纬度/经度区域内事件的累积权重进行分组。

mongo中,目前是这样的(没有索引,试了没成功):

events: {
latitude: Number,
longitude: Number,
weight: Number
}

db.events.mapReduce(function() {
emit({
latitudeGroup: Math.floor(this.latitude / 1.2),
longitudeGroup: Math.floor(this.longitude / 1.8)
}, this.weight);
}, function(key, values) {
return Array.sum(values)
}, { out: 'inline' })

请注意,1.2 和 1.8 是任意的和动态的,缓存每个可能组合的结果将非常占用内存。查询需要 1500 毫秒,这对于实时 Web 应用程序来说太长了。

来自关系世界,我在 Postgres 中尝试了同样的方法:

CREATE TABLE event (
id BIGSERIAL NOT NULL PRIMARY KEY,
latitude NUMERIC NOT NULL,
longitude NUMERIC NOT NULL,
weight INTEGER NOT NULL
);

SELECT floor(latitude / 1.2) AS latitudeGroup, floor(longitude / 1.8) AS longitudeGroup, SUM(weight) FROM event GROUP BY latitudeGroup, longitudeGroup;

这需要更可接受的 400 毫秒,没有使用任何 Postgres GiST 功能。

我只是想知道我是否在 mongo 方面遗漏了什么。我已经研究过聚合框架,但我认为我正在做的事用它是不可能的。

如果有某种方法可以使这项工作具有合理的性能,我将非常高兴。这是我正在开发的原型(prototype)的一个关键特性,在这个阶段数据库切换的成本不会太高。

最佳答案

首先你应该用索引来测试。

您是否尝试过使用聚合框架而不是 MapReduce?

db.events.aggregate([
{ $group : {
_id : { "latitude" : "$latitude", "longitude" : "$longitude" } ,
weight : { "$sum" : { $multiply : ["$weight",1.2]} }
}}
])

聚合框架使用与数据库核心查询引擎相同的机制(不像使用 V8 引擎的 MapReduce)

关于mongodb - 如何使用动态组优化缓慢的 Mongo MapReduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22734416/

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