gpt4 book ai didi

ruby-on-rails - mongodb 中的高效下采样

转载 作者:可可西里 更新时间:2023-11-01 09:13:46 25 4
gpt4 key购买 nike

我有一个数据库,我在其中存储大量数据并生成图 TableView 。我没有返回图表的所有数据,而是只返回预定义数量的样本。我目前这样做的方式是在 mongo 上使用 map/reduce 作业,但我不知道我这样做的方式是否非常有效,它需要 14 秒并将 CPU 卡在具有超过 89000 个样本的图表上例子。

下采样通过计算“分辨率”来工作,即(总点数)/(所需样本数)。然后它使用范围变量保持和外部计数和索引。然后它基本上会查看每个点,并根据分辨率和计数/索引变量的当前状态决定是否将其包含在结果列表中。

这工作正常,但速度很慢,而且可能无法扩展。我想知道是否只返回所有点并在 ruby​​ 中进行下采样会更好,或者也许有更好的方法。

最佳答案

万一有人感兴趣,这是我想出的解决方案。由于 mongodb 的一些限制,我花了一段时间才弄清楚,但它工作得很好,比我当前的 map reduce 解决方案快 10 倍。

聚合代码如下:

db.data.aggregate(
{$match: {$and: [{graph_id: gid}, {"x.value": {$gt: start, $lt: stop}}]}},
{$project: {x: 1, y: 1, series: 1, chunk: {$subtract: [{$divide: ["$x.value", step]}, {$mod: [{$divide: ["$x.value", step]}, 1]}]}}},
{$group: {
_id: {
chunk: "$chunk",
series: "$series"
},
series: {$first: "$series"},
x: {$first: "$x"},
y: {$first: "$y"},
}
},
{$sort: {"x.value": 1}}
)

此解决方案对数据进行分块。我想做一些类似 int(x.value/step) 的事情,但是 mongodb 没有整数数学运算符。所以我不得不用 ((x.value/step) - ((x.value/step) % 1)) 来伪造它,它给你除法的整数部分。

这很有效,可以让您轻松地对 block 进行平均,而不是只选择第一个 block 。

关于ruby-on-rails - mongodb 中的高效下采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15189409/

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