有没有一种简单的方法可以获取最后 x 分钟的成功读取百分比?
Is there an easy way to get the percentage of successful reads of last x minutes?
我有一个 Beaglebone Black 设置,它每秒通过 I²C 与他的奴隶通信并从他们那里读取数据。有时 I²C 读出会失败,我想获得有关这些失败的统计信息。
我想实现一种算法来显示过去 5 分钟(最多 24 小时)的成功通信百分比并不断更新该值。如果我用一个数组来实现 'normally' ,我在其中存储每秒 success/no 成功,那将意味着很多 RAM/CPU 负载被浪费用于次要功能(特别是如果我想查看最近 24 小时的统计数据)。
有人知道这样做的好方法吗,或者有人能指出正确的方向吗?
你为什么不直接实现一个低通滤波器?对于每一次成功的传输,你推入一个 1,对于每一个失败的传输,你推入一个 0;结果是一个介于 0 和 1 之间的数字。假设您的传输是周期性发生的,这很有效——您只需将该滤波器的截止频率调整到您想要的 "averaging duration".
但是,我无法理解您的 RAM 论点:假设您存储一个字节来表示每次传输的成功或失败,您说每秒发生一次,那么您最终每天有 86400B -- 85KB/天真的可以忽略不计.
编辑 截止频率来自信号理论,描述了通过低通或高通滤波器的最高或最低频率。
实现低通滤波器很简单;像(伪代码):
new_val = 1 //init with no failed transfers
alpha = 0.001
while(true):
old_val=new_val
success=do_transfer_and_return_1_on_success_or_0_on_failure()
new_val = alpha * success + (1-alpha) * old_val
这是单抽头 IIR(无限脉冲响应)滤波器;单击一次,因为只有一个字母,因此只有一个数字存储为状态。
EDIT2:alpha
的值定义了此过滤器的行为。
EDIT3:可以用一个滤波器设计工具给你正确的alpha
;只需将低通滤波器的截止频率设置为 0.5/integrationLengthInSamples,select IIR 的 0 阶并使用椭圆设计方法(大多数工具默认为 butterworth,但 0 阶 butterworths 不做任何事情).
我将使用 scipy 并将生成的 (b,a)
元组(a
在这里为 1)转换为此反馈表的正确形式。
更新 根据 OP 'determine a trend of which devices are failing' 的评论,我会推荐 Marcus Müller ꕺꕺ 提出的几何平均值。
准确方法
下面的方法旨在获取 'well defined' 随时间变化的性能统计数据,这些数据对于 'after the fact' 分析也很有用。
请注意,几何平均值在最近的消息而不是固定时间段内具有 'look back'。
维护一个 24*60/5 = 288 'prior success rates'(SR[i] with i=-1, -2,...,-288)的滚动数组,每个代表 5 分钟的间隔前 24 小时。
如果元素是 64 位双精度,那将消耗大约 2.5K。
为了 'effect' 不断更新使用估计的 'Current' 成功率如下:
ECSR = (t*S/M+(300-t)*SR[-1])/300
其中 S 和 M 是当前(部分完成的时间段)中错误和消息的计数。SR[-1] 是前一个(现在完成的)存储桶。
t 是当前桶过期的秒数。
注意:启动时需要使用300*S/M/t。
本质上,近似假设错误率在之前的 5 - 10 分钟内保持稳定。
为了 'effect' 24 小时回顾,您可以 'shuffle' 在每 5 分钟间隔结束时向下(通过复制或 memcpy()
)数据,或者实施 'circular array by keeping track of the current bucket index'.
注意: 对于许多 management/diagnostic 目的,15 分钟的间隔通常是完全足够的。您可能希望使 'grain' 可配置。
我有一个 Beaglebone Black 设置,它每秒通过 I²C 与他的奴隶通信并从他们那里读取数据。有时 I²C 读出会失败,我想获得有关这些失败的统计信息。
我想实现一种算法来显示过去 5 分钟(最多 24 小时)的成功通信百分比并不断更新该值。如果我用一个数组来实现 'normally' ,我在其中存储每秒 success/no 成功,那将意味着很多 RAM/CPU 负载被浪费用于次要功能(特别是如果我想查看最近 24 小时的统计数据)。
有人知道这样做的好方法吗,或者有人能指出正确的方向吗?
你为什么不直接实现一个低通滤波器?对于每一次成功的传输,你推入一个 1,对于每一个失败的传输,你推入一个 0;结果是一个介于 0 和 1 之间的数字。假设您的传输是周期性发生的,这很有效——您只需将该滤波器的截止频率调整到您想要的 "averaging duration".
但是,我无法理解您的 RAM 论点:假设您存储一个字节来表示每次传输的成功或失败,您说每秒发生一次,那么您最终每天有 86400B -- 85KB/天真的可以忽略不计.
编辑 截止频率来自信号理论,描述了通过低通或高通滤波器的最高或最低频率。
实现低通滤波器很简单;像(伪代码):
new_val = 1 //init with no failed transfers
alpha = 0.001
while(true):
old_val=new_val
success=do_transfer_and_return_1_on_success_or_0_on_failure()
new_val = alpha * success + (1-alpha) * old_val
这是单抽头 IIR(无限脉冲响应)滤波器;单击一次,因为只有一个字母,因此只有一个数字存储为状态。
EDIT2:alpha
的值定义了此过滤器的行为。
EDIT3:可以用一个滤波器设计工具给你正确的alpha
;只需将低通滤波器的截止频率设置为 0.5/integrationLengthInSamples,select IIR 的 0 阶并使用椭圆设计方法(大多数工具默认为 butterworth,但 0 阶 butterworths 不做任何事情).
我将使用 scipy 并将生成的 (b,a)
元组(a
在这里为 1)转换为此反馈表的正确形式。
更新 根据 OP 'determine a trend of which devices are failing' 的评论,我会推荐 Marcus Müller ꕺꕺ 提出的几何平均值。
准确方法
下面的方法旨在获取 'well defined' 随时间变化的性能统计数据,这些数据对于 'after the fact' 分析也很有用。 请注意,几何平均值在最近的消息而不是固定时间段内具有 'look back'。
维护一个 24*60/5 = 288 'prior success rates'(SR[i] with i=-1, -2,...,-288)的滚动数组,每个代表 5 分钟的间隔前 24 小时。
如果元素是 64 位双精度,那将消耗大约 2.5K。
为了 'effect' 不断更新使用估计的 'Current' 成功率如下:
ECSR = (t*S/M+(300-t)*SR[-1])/300
其中 S 和 M 是当前(部分完成的时间段)中错误和消息的计数。SR[-1] 是前一个(现在完成的)存储桶。
t 是当前桶过期的秒数。
注意:启动时需要使用300*S/M/t。
本质上,近似假设错误率在之前的 5 - 10 分钟内保持稳定。
为了 'effect' 24 小时回顾,您可以 'shuffle' 在每 5 分钟间隔结束时向下(通过复制或 memcpy()
)数据,或者实施 'circular array by keeping track of the current bucket index'.
注意: 对于许多 management/diagnostic 目的,15 分钟的间隔通常是完全足够的。您可能希望使 'grain' 可配置。