计算实时事件频率的替代方法

问题描述 投票:1回答:2

我正在一个有大量外部事件报告的应用程序中工作。经常使用的指标之一是事件率与时间的关系。例如,测量某些外部异步传感器的采样率。

目前,我这样计算事件发生频率的方法是保持事件时间戳的队列。事件发生时,我们将当前时间戳记推送到队列中,然后弹出直到最早的时间戳记小于预定义的期限。然后,事件频率与队列的大小成正比。在伪代码中,该方法通常如下所示:

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

现在这种方法显然不是最佳方法:

  1. 内存需求和计算时间与事件发生率成正比。
  2. 必须根据预期的数据速率手动调整队列持续时间,以调整低频性能与内存需求。
  3. 频率测量的响应时间还取决于队列持续时间。持续时间越长,计算响应时间越短。
  4. 仅在发生新事件时才更新频率。如果事件停止发生,则频率测量将保持在接收到最后一个事件时计算出的值。

我很好奇是否可以使用其他算法来计算事件的发生率,以及它们在计算复杂性,空间要求,响应时间等方面具有哪些取舍?

algorithm frequency counting frequency-analysis
2个回答
0
投票

[另一种选择是以固定速率(例如每秒一次)触发的本地计时器:

  • 当发生外部事件时,它会增加一个计数器。
  • 当本地计时器触发时,计数器值添加到队列中,并且计数重置为零。

以下是该方法与您的方法的比较:

  1. 内存需求和计算时间与外部事件发生率无关。它由您控制的本地计时器速率确定。
  2. 队列大小取决于您要执行的平均次数。队列大小为1(即无队列)且计时器速率为每秒一次的结果是每秒读取原始事件,并且没有求平均值。队列越大,得到的平均数就越多。
  3. 响应时间取决于所需的平均量。平均数越多,响应时间越慢。
  4. 以本地计时器触发的频率更新频率,而不管是否发生外部事件。

0
投票

https://en.wikipedia.org/wiki/Exponential_smoothing非常有效,并且仅使用少量有限的内存。您可以尝试对到达时间进行指数平滑。在检索平滑的到达时间之前,您可以查看到上一个事件的时间,如果大于平滑的到达时间,则将其混合。

这有很大的不同,实际上我将从收集当前使用的时间戳样本开始,以便可以离线使用它来测试此方案或其他方案的结果。

© www.soinside.com 2019 - 2024. All rights reserved.