【发布时间】:2016-03-31 08:48:49
【问题描述】:
我正在为一些产生大量基于时间的数据(如温度、电流或电压)的工业设备构建可视化。所有数据都不断写入 SQL Server 数据库(无法控制该部分)。
HTML5 前端由我使用 d3.js 制作的交互式可缩放图表组成。数据系列可以按需添加(加载)到图表中,在这种情况下,前端发送一个 ajax 请求,ASP.NET MVC 和 EF6 从 DB 中获取值并将它们作为 Json 返回。
每个数据元素仅由一个 DateTime 和一个值组成。请注意,这些值不是以固定间隔(如每 2 秒左右)写入,而是以不规则间隔写入。这是因为设备不会定期轮询,而是发送有关特定事件的数据,例如温度因给定的 0.1 °C 变化而升高/下降。
到目前为止,一切都运行得非常顺利,但是大量的数据成为一个问题。例如,当我想显示一个选定时间段的折线图,比如说 3 个月,每个数据系列已经包含 appr。 500.000 个值,因此来自服务器的 Json 响应也越来越大,并且请求所需的时间越来越长。
所以我正在寻找一种方法来减少数据量而不丢失相关信息,例如温度曲线中的峰值等,但同时我想消除信号中的噪声。
这是一个示例,请记住,这只是几个小时或几天的选定时间段,通常用户希望查看几个月甚至几年的数据:
绿线是温度,红线是数字状态的表示(在这种情况下,是一个使温度曲线上升的加热器)。
您可以清楚地看到信号中的噪声,这就是我想要摆脱的。同时,我想保留加热器打开后温度急剧上升和下降后的特征。
我已经尝试将原始数据切成给定长度的块,然后聚合其中的数据,这样我就有了该间隔的最小值、最大值和平均值。这行得通,但是这样做会使曲线的特征丢失,并且一切都变得平坦或平均化。这是一张与上面相同时期的图片,稍微缩小了一点,以便聚合开始:
上方系列的平均值显示为绿线,每个印章的范围(最小/最大)由平均线周围的绿色区域表示。
是否有某种奇特的算法可以在数据从数据库中出来并发送到前端之前用于过滤/平滑/减少数据?我需要挖掘的流行语是什么?高度赞赏任何特定的库、框架或技术,以及关于该主题的一般 cmet。我主要对服务器端解决方案感兴趣,但请随意提及客户端 Javascript 解决方案,因为其他面临相同问题的人肯定会对它们感兴趣。
【问题讨论】:
-
您正在寻找的流行词是时间序列。它没有灵丹妙药。但很可能您需要根据缩放来汇总您的值。因此,对于最小缩放,您将聚合大量减少您正在检索的数据数量等等......
-
你说得对,我已经考虑到了这一点。聚合印章大小取决于图表大小和当前可见的时间范围,或者更准确地说:图表根据可用的图表宽度划分为给定数量的间隔,以便聚合的粒度始终与视觉外观相匹配.缩小时块间隔变大(可见范围增加),块数保持不变。
-
也许可以考虑从 sql server 转移到 nosql 并使用 map-reduce 来聚合。
-
很遗憾,我无法更改那部分。
标签: javascript c# asp.net-mvc d3.js