algorithm - 计算实时事件频率的替代方法
问题描述
我正在一个有大量外部事件报告的应用程序中工作。经常使用的指标之一是作为时间函数的事件率。例如,测量某些外部异步传感器的采样率。
目前我计算此类事件频率的方式是保留事件时间戳队列。当事件发生时,我们将当前时间戳推送到队列中,然后弹出直到最旧的时间戳小于预定义的年龄。然后,事件频率与队列的大小成正比。在伪代码中,该方法通常看起来像这样:
def on_event():
var now = current_time()
time_queue.push(now)
while((now - time_queue.front()) > QUEUE_DEPTH_SECONDS):
time_queue.pop()
frequency = time_queue.size() / QUEUE_DEPTH_SECONDS
现在这种方法显然不是最优的:
- 内存需求和计算时间与事件率成正比。
- 队列持续时间必须根据预期的数据速率手动调整,以调整低频性能与内存要求。
- 频率测量的响应时间也取决于队列持续时间。较长的持续时间会降低计算的响应时间。
- 仅在发生新事件时更新频率。如果事件停止发生,则频率测量值将保持在接收到最后一个事件时计算的值。
我很好奇是否有任何替代算法可用于计算事件发生率,以及它们在计算复杂性、空间要求、响应时间等方面的权衡。
解决方案
https://en.wikipedia.org/wiki/Exponential_smoothing非常高效,并且只使用少量有限的内存。您可以尝试对到达间隔时间进行指数平滑。在检索平滑的到达间隔时间时,您可以查看最后一个事件的时间,如果它大于平滑的到达间隔时间,则将其混合。
这已经足够不同了,实际上我会从收集当前使用的时间戳样本开始,这样我就可以使用它来离线测试这个或其他方案的结果。
推荐阅读
- python - python3 - urllib - ssl - UnicodeDecodeError
- pandas - 如何在传递给 Plotly 函数之前重塑 Pandas 数据框?
- javascript - 如何在页面加载时用javascript中的另一个文本替换文本?
- c++ - 二进制表达式的C++无效操作数?
- android-studio-4.0 - 如何解决由于设备离线而导致安装失败的问题?会话“应用程序”:安装未成功。无法安装应用程序。重试
- javascript - 如何从共享对象名称的字符串运行方法
- traefik - 路径上的 Traefik 基本身份验证
- python - 从 FlaskWTF MultipleFileField 中删除选定的文件
- reactjs - React:“警告:无法在未安装的组件上执行 React 状态更新” - 尝试更新时
通过上下文状态 - javascript - 想要在 react-native 条件渲染中根据文本输入值输出文本