代码之家  ›  专栏  ›  技术社区  ›  Steve Wasiura

如果在相同的15秒时间范围内,如何计算流事件数?

  •  0
  • Steve Wasiura  · 技术社区  · 7 年前

    我收到一个连续的数据流。

    每个数据点都包含一个DateTime对象。

    我想计算在15秒的时间范围内接收到多少数据点。

    15秒以后可能会改变,所以我尽量在代码思想上灵活一些。

    我最初的想法是提取DateTime对象中秒数的值。。。i、 内景 s

    然后分开 s 根据时间范围(15),确定该数据点应放置在(0、1、2或3)的15秒范围内的“组”,因为最大秒数将在范围[0-59]内。

    当数据点进入所选组时,所有其他计数器都将重置为0,因为数据点没有出现在这些其他组中,所以它们不应该有计数。

    如果要到达的下一个数据点移动到与计数器递增的前一个组不同的组中,我需要从所有组中获取计数器的值,消除计数器的0值,并将计数器值保存到一个变量中,传递给另一个函数,以确定变量是否在可接受的范围内。


    我的问题是,这类编程问题/模型是否有一个名称,这样我就可以从网络搜索中找到它,并做更多的阅读来找出这是一种好的方法,还是模型表明有一种更简单的方法?

    4 回复  |  直到 7 年前
        1
  •  1
  •   sean Sergey Berezovskiy    7 年前

    对于触发的每个数据到达事件,递增一个计数器。设置一个计时器每15秒响一次。根据需要记录计数器值(在列表、字典等中),然后重置计数器。

        2
  •  0
  •   Gauravsa    7 年前

    可以使用HashMap将键设为[0-59],值设为数据点列表。

    使用堆也可以使列表更智能一些,以便最高或最低值位于顶部。如果下一个数据点大于最高元素,则可以将其放在堆的顶部。

        3
  •  0
  •   Austin T French    7 年前

    如果这个过程是在非零时间范围内开始的呢?

    我觉得你把事情复杂化了。我只想用一个表达式来过滤时间框架:

    使用生成的列表和Linq的示例:

    var start = DateTime.Now.AddHours(-1);
            List<DateTime> times = new List<DateTime>();
    
            int i = 1;
            var currentTime = new DateTime();
            do
            {
                currentTime = start.AddSeconds(.5 * i);
                times.Add(currentTime);
                i++;
            } while (currentTime < DateTime.Now);
    
            times.Where(t => t >= start.AddSeconds(15) && t <= start.AddSeconds(30))
               .ToList().ForEach(f => Console.WriteLine(f));
    
        4
  •  0
  •   NetMage    7 年前

    在第一次输入时,将窗口的开头设置为 DateTime 并初始化组以保留数据点。

    • 如果经过的时间超过了窗口持续时间,则存储计数和组(或发送它们),并将窗口开始时间重置为 DataTime