缓存时间序列的差异聚合

时间:2017-01-08 19:02:56

标签: algorithm caching language-agnostic aggregate

是否可以预先计算(缓存)两个信号的差异值的聚合(最小值/最大值/平均值)?

我有几个通道(例如50个),每秒一个或多个测量值,我可以轻松存储预先计算的1分钟或15分钟聚合,以便更快地显示。

但其中一个要求是显示相对值的图表。例如。如果我有频道C1C2C3,则用户希望看到C1的平均值和(C2 - C3)的平均值(或最少15分钟/最大值)在另一张图表上。

例如,假设我有这两个频道(还有48个频道):

t(min)    0    +1   +2   +3   +4   +5   +6   +7   +8   +9   +10
C1       0.0  0.1  0.2 -0.1  0.0  0.1  0.3  0.5  0.7  0.9  0.2
C2       0.1  0.4  0.2  0.1 -0.1  0.5  0.6  0.1  0.2  0.3  0.0

我可以预先计算并存储5分钟的聚合:

t(min)    0 to +4    +5 to +10
C1_min     -0.1         0.1
C1_max      0.2         0.9
C2_min     -0.1         0.0
C2_max      0.4         0.6

很容易从中获得10分钟或15分钟的聚合。

但是,如果用户希望看到min(C2-C1)max(C2-C1) 5分钟聚合,则对于这50个频道的任意组合,我似乎无法重复使用此信息。

换句话说,在我看来除了存储这些元组的每个可能组合之外,不可能预先计算这个元组,因为min(C2-C3)不等于min(C2)-min(C3)

我错过了一些可能有助于我更快地计算这些值的想法吗?

1 个答案:

答案 0 :(得分:1)

您只需拥有C2C3的所有数据即可获得汇总min(C2-C3)

但是,如果您的目标是最小化执行此计算所需的数据,我建议您按以下方式执行此操作(此解决方案将需要处理大数字 - 取决于通道数量):

如果您知道所有频道的值都不会超过某个值(让我们说10),那么我们可以将所有频道组合在一起。 1个频道中的数据,我们将其命名为C

计算C

C = (C1 * 10^1) + (C2 * 10^2) + (C3 * 10^3) + .. + (Cn * 10^n).

您最终会拥有一个包含所有通道值的频道C

然后在某个时刻计算2个频道之间的差异,你所要做的就是提取"提取"来自C的2个频道值:

C1 = floor((C mod 10^1) / 10^(1-p)) / 10^p
C2 = floor((C mod 10^2) / 10^(2-p)) / 10^p
...
Cn = floor((C mod 10^n) / 10^(n-p)) / 10^p

其中p是提取的通道值的小数精度。

在这种情况下,使用预先计算的x计算两个频道yC之间的差异将是:

min(Cy-Cx) = min((floor((C mod 10^y) / 10^(y-p)) / 10^p) - (floor((C mod 10^x) / 10^(x-p)) / 10^p))

然后您可以在一段时间内聚合这些值。希望它有所帮助。

相关问题