Lou*_*Lou 7 language-agnostic algorithm caching aggregate
是否有可能预先计算(缓存)两个信号差异的值的聚合(最小值/最大值/平均值)?
我有几个通道(例如50个),每秒进行一次或多次测量,我可以轻松存储预先计算的1分钟或15分钟聚合,以便更快地显示.
但其中一个要求是显示相对值的图表.例如,如果我有频道C1,C2并且C3用户希望在单独的图表上查看平均值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
Run Code Online (Sandbox Code Playgroud)
我可以预先计算并存储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
Run Code Online (Sandbox Code Playgroud)
并且很容易从中获得10分钟或15分钟的聚合.
但是,如果用户想要查看min(C2-C1)或max(C2-C1)5分钟聚合,对于这50个频道的任何组合,似乎我无法重复使用此信息.
换句话说,在我看来,除了存储这些元组的每个可能组合之外,不可能预先计算它,因为min(C2-C3)不相等min(C2)-min(C3).
我错过了一些可能有助于我更快地计算这些值的想法吗?
C2您只需要拥有和的所有数据即可C3获得聚合min(C2-C3)。
但是,如果您的目标是最小化执行此计算所需的数据,我建议您按以下方式执行(此解决方案将需要处理大数字 - 取决于通道数量):
如果您知道所有通道的值都不会超过某个值(假设是10),那么我们可以将所有通道的数据合并到 1 个通道中,我们将其命名为C
计算C:
C = (C1 * 10^1) + (C2 * 10^2) + (C3 * 10^3) + .. + (Cn * 10^n).
Run Code Online (Sandbox Code Playgroud)
您最终会得到一个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
Run Code Online (Sandbox Code Playgroud)
其中p是提取的通道值的小数精度。
在这种情况下,两个通道之间的差异计算x并y使用预先计算C将是:
min(Cy-Cx) = min((floor((C mod 10^y) / 10^(y-p)) / 10^p) - (floor((C mod 10^x) / 10^(x-p)) / 10^p))
Run Code Online (Sandbox Code Playgroud)
然后您可以在一段时间内汇总这些值。希望能帮助到你。