加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – mongodb中的高效羽绒采样

发布时间:2020-12-17 02:20:36 所属栏目:百科 来源:网络整理
导读:我有一个数据库,我存储了大量数据并生成了图形视图.我没有返回图表的所有数据,而只返回预定义数量的样本.我目前这样做的方式是在mongo上使用map / reduce作业,但我不知道我这样做的方式是否非常有效,需要14秒并且在图表上固定CPU,其中包含超过89000个样本例.
我有一个数据库,我存储了大量数据并生成了图形视图.我没有返回图表的所有数据,而只返回预定义数量的样本.我目前这样做的方式是在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",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))来伪造它,它给出了除法的整数部分.

这很好用,可以让你做一些事情,比如平均块而不是只选择第一块,非常容易.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读