Я работаю над приложением Windows C++ и должен добавить возможность корреляции. На данный момент у меня есть два продюсера событий, каждый производитель генерирует подобные события. Средний комбинированный коэффициент генерации событий составляет 2 к/сек для обоих производителей. Однако при нагрузке он скачет до 300-500 к/сек. Это как упрощенная версия события выглядетьЭффективно коррелировать события
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)
Я думал о
- в HashMap (ProcessId, как ключ) с очередями (для корреляции времени и действия)
- Boost трубопроводы (пример на github)
Но я не уверен, как справляться с выселением быстрых событий, поскольку мне необходимо снизить загрузку процессора и памяти.
Может ли кто-нибудь предложить решение, позволяющее эффективно коррелировать события (минимальное влияние на процессор и низкий объем памяти)?
Вы ищете корреляцию между объемом произведенных событий или некоторой характеристикой событий? Допускается ли выборка и оценка или вам нужна точная мера корреляции? – Dave
Это характеристика событий: в спорном потоке событий мне нужно, чтобы найти те, которые соответствуют моему фильтру. Возможно, слово «корреляция» здесь не совсем верно. Выборка/оценка могут приводить к ошибкам, когда я могу пропустить важные данные, но я думаю, что могу применить некоторую фильтрацию для дедупликации событий, так как будет много «близких» дубликатов. – oleksii