有效地关联事件

时间:2016-11-28 11:32:41

标签: c++ algorithm events filter correlation

我正在开发一个C ++ Windows应用程序,需要添加一个关联功能。目前我有两个事件生成器,每个生产者生成类似的事件。两个生产者的平均事件发生率为2k / sec。但是,它在负载下会跳到300-500 k / sec。这就是事件的简化版本的样子

Event
    ProcessId // e.g. 1234 
    Action    // e.g. 0, 1, 2
    Timestamp // e.g. LARGE_INTEGER Windows timestamp

我需要构建的关联规则如下所示

Filter

    // events are from the same process
    ev1.ProcessId == ev2.ProcessId  

    &&

    // events have specific types
    ( ev1.Action == 0 && ev2.Action == 1) 

    &&

    // they are less than 2 secs apart
    ( abs(ev1.Timestamp - ev2.Timestamp) < 2 seconds) 

我在考虑

  • 带有队列的哈希映射(ProcessId作为键)(用于时间和动作关联)
  • 提升管道(github上的示例)

但我不知道如何处理快速事件驱逐,因为我需要保持较低的CPU和内存利用率。

任何人都可以建议一个解决方案,让我能够有效地关联事件(最小的CPU影响和低内存占用)?

1 个答案:

答案 0 :(得分:1)

由于你有一个相当小的相关窗口,你可以先将你的数据分开,以便于驱逐。

将流1中的所有对象(较慢/较小的流)存储在三个哈希映射的循环缓冲区中。当您刚刚获得的事件的时间戳比您放入最新的hashmap的第一个时间戳早了两秒以上时,您清空最旧的hashmap并将其放在前面,将所有其他的向下移动一步。您还可以记录您现在放入此存储桶的第一个项目的“开始时间”。

这允许您保留来自流1的大约4-6秒数据的循环缓冲区,这为没有以正确顺序传递的消息提供了一点缓冲。

对于流2(更大/更快的流),您只需在所有哈希映射中进行查找。当你得到一个匹配,你使用你的相关函数检查它实际上是一个真正的匹配。对于O(m+b*n log k/b)b的流,k段中的n个哈希映射(存储桶)和n个消息在流m中每秒运行一次b=3消息。对于O(m + n log k),您在流n中每秒k条消息6k。空间要求应在b附近。

如果仅使用三个散列图使得性能太过分(在内存使用和cpu使用方面(清空散列图确实需要一些时间)),您可以使用更多的散列图(增加addHero (name: string): Observable<Hero> { let headers = new Headers({ 'Content-Type': 'application/json' }); let options = new RequestOptions({ headers: headers }); return this.http.post(this.heroesUrl, { name }, options) .map(this.extractData) .catch(this.handleError); )。只需保留足够的时间来保存在内存中,加上一两个,并记住迟到的小缓冲区。