Как считать потоковые события, если в пределах одного и того же 15-секундного диапазона времени? - PullRequest
0 голосов
/ 24 октября 2018

Я получаю последовательный поток данных.

Каждое событие поступления данных запускает один и тот же метод в моем коде C #.

Каждая точка данных содержит объект DateTime.

Я хочу подсчитать, сколько точек данных принимается в течение 15-секундного временного диапазона.

15 секунд может быть изменено вбудущее, поэтому я пытаюсь быть гибким в своей идее кода.

Мои первоначальные мысли состоят в том, чтобы извлечь значение числа секунд в объекте DateTime ... т.е. int s = dataPoint.dtObj.second;

Затем разделите s на временной диапазон (15), чтобы определить, какая "группа" изВ диапазоне 15 секунд этот пункт данных должен быть помещен в (0, 1, 2 или 3), так как максимальное количество секунд будет в диапазоне [0 - 59].

У каждой группы будет свой счетчик.

Когда точка данных перейдет в выбранную группу, все остальные счетчики будут сброшены на 0, так как точка данных не встречалась в этих других группах, поэтомуу них не должно быть счетчика.

Если следующий пункт назначения данных перемещается в другую группу, чем предыдущая группа, в которой счетчик был увеличен, мне нужно извлечь значение счетчиков из всех групп, исключив 0значения счетчика и сохраните значение счетчика в переменной для передачи в другую функцию, чтобы определить, находится ли переменная в допустимых пределах.


Мой вопрос, есть ли имя для этого типапроблемы программирования / модели, поэтому я могу найти ее в веб-поиске и больше читать, чтобы выяснить, является ли это хорошим методом подхода, или если модель предполагает, что есть более простой способ?

Ответы [ 4 ]

0 голосов
/ 25 октября 2018

Предполагая, что точки данных получены в хронологическом порядке (в противном случае вам придется определить какой-то произвольный предел буфера и просто обработать буфер).

На первом входе установите начало окна вDateTime первой точки данных и инициализируйте группу для хранения точки данных.

На каждом последующем входе

  • , если истекшее время меньше, чем окнопродолжительность (15 секунд), увеличьте счет и добавьте точку данных в группу.
  • Если истекшее время превышает длительность окна, сохраните счет и группу (или отправьте их) и сбросьте началоокна на DataTime текущей точки данных и сбросьте группу на текущую точку данных.
0 голосов
/ 24 октября 2018

Вы можете использовать HashMap, чтобы иметь ключ в качестве [0-59] и значение в качестве списка dataPoints.

Список также может быть немного умнее с кучей, так что самые высокие или минимальные значения находятся сверху.Если следующая точка данных больше, чем самый высокий элемент, вы можете поместить ее в верхнюю часть кучи.

0 голосов
/ 24 октября 2018

Что делать, если процесс начинается с ненулевого периода времени?

Я чувствую, что вы слишком усложняете вещи.Я бы просто использовал выражение для фильтрации по таймфреймам:

Пример использования сгенерированного списка и 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));
0 голосов
/ 24 октября 2018

Для каждого возникающего события поступления данных увеличивайте счетчик.Установите таймер на каждые 15 секунд.Запишите значение счетчика по своему усмотрению (в списке, словаре и т. Д.) И сбросьте счетчик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...