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

ruby-on-rails – mongodb中的高效羽绒采样,第1张

概述我有一个数据库,我存储了大量数据并生成了图形视图.我没有返回图表的所有数据,而只返回预定义数量的样本.我目前这样做的方式是在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))来伪造它,它给出了除法的整数部分.

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

总结

以上是内存溢出为你收集整理的ruby-on-rails – mongodb中的高效羽绒采样全部内容,希望文章能够帮你解决ruby-on-rails – mongodb中的高效羽绒采样所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1275214.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存