Существует ли хорошо зарекомендовавший себя инкрементный алгоритм для хранения истории значений с накоплением за определенные периоды времени?

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

Моя система (которую я намереваюсь использовать с открытым исходным кодом) имеет поток данных NetFlow. Вместо того, чтобы хранить в базе данных и использовать функции SQL, я предпочитаю иметь систему без базы данных и поддерживать набор статистических данных, обновляемых для каждого нового потока и прокручиваемых в секунду (или выше).

Мое решение включает в себя единый массив uint для эффективного создания зубчатого массива размеров [60, 59, 23, 6,...], представляющего секунды, минуты, часы, дни, недели и т. д....

Каждый слот содержит общее количество байтов за это время. Таким образом, через 60 секунд создается статистика за одну минуту в виде Avg(seconds). Это, конечно, продолжается относительно вверх по временной шкале.

Вместо того, чтобы просто иметь тысячи секунд приращения, это связано с:

  1. Ограничения памяти и возможность иметь больше статистических узлов; А ТАКЖЕ
  2. Идеальная презентация для пользователей

...что я сворачиваю шкалу времени.

Учитывая, что поток может быть применен к нескольким узлам в иерархии статистики (канал WAN, IP-адрес, адрес назначения, порт-источник-порт-получателя), я вычисляю дельту один раз (GenerateDelta), а затем просто применяю к каждому узлу, который является одновременно активным и который соответствует метаданным потока.

Статистика на данном узле будет «прокручиваться» в следующих возможных случаях:

  1. При чтении/отображении (через запрос HTTP\JSON AJAX)
  2. Когда применяется дельта (из-за соответствующего потока)
  3. Просто каждые n секунд (n обычно равно 1)

В целом может существовать хорошо зарекомендовавший себя алгоритм для хранения промежуточных сумм с течением времени (с секундами, минутами...). Но в противном случае могут быть подходящие алгоритмы для сравнения небольших подразделов моего кода:

  • GenerateDelta — маловероятно, так как это специфично для разбивки и усреднения потока с длительностью по слотам в массиве статистики.
  • Прокрутка - если бы были только секунды, то это, конечно, было бы просто, однако мое решение требует, чтобы 60 секунд объединялись в новую сумму минут каждые 60 секунд и так далее.

Я не хочу, чтобы респонденты предлагали какие-либо свои собственные алгоритмы, я уже (почти) выполнил все свои собственные без каких-либо проблем и со многими соображениями производительности. И другие, вероятно, смогут взглянуть на мой алгоритм, когда я закончу и опубликую его как Open Source.

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

Спасибо!


person Todd    schedule 19.12.2012    source источник
comment
Как и просили, я не критикую ваш дизайн и не предлагаю альтернатив. Это более или менее исключает ответ на ваш вопрос. Попутно отмечу, что у каждого крупного поставщика услуг есть система мониторинга производительности, точные детали которой могут быть недоступны для общественности. Таким образом, существует совокупность знаний о том, как это сделать. Кое-что из этого было опубликовано, но я не знаю, как это согласуется с хорошо зарекомендовавшим себя. В любом случае, я предлагаю вам попробовать что-то вроде этого поиска: ученый. google.com/scholar?q=%22stream+statistics%22&hl=ru   -  person rici    schedule 19.12.2012
comment
Потоковая статистика, возможно, является ответом, называя область моей проблемы.   -  person Todd    schedule 19.12.2012
comment
Если я или кто-то другой найдет такую ​​статью/алгоритм в области потоковой статистики, которая конкретно подходит для моей проблемы, описанной выше, это будет скорее прямой ответ.   -  person Todd    schedule 19.12.2012


Ответы (1)


Благодаря комментарию @rici я обнаружил, что домен «Stream Statistics» — это то, что требуется. Существуют системы управления потоками данных (DSMS) для работы со статистикой потоков. В то время как системы СУБД SQL могут хранить данные со статистикой, сгенерированной запросом SQL, системы управления потоками данных позволяют обрабатывать непрерывный поток данных по одному или нескольким запросам.

В этом документе DSMS описывается как:

  1. Возможность пожертвовать качеством ради качественного использования
  2. Однопроходный, потому что данные огромны
  3. Наличие запросов, обрабатывающих данные как последовательности, а не наборы И многое другое...

Этот, изображает диаграмму такой DSMS, ссылается на проблемную область анализа сетевого трафика,

В этом документе описывается StreamSQL, подобный SQL синтаксис, для определения непрерывные запросы.

Даже если проприетарные решения недоступны. Наверняка есть хорошо отработанные алгоритмы. Таким образом, я могу протестировать производительность моей специализированной системы в сравнении с обычными инструментами потокового запроса.

Несколько продуктов/прототипов DSMS можно найти на этой вики-странице, в частности Odysseus представляет интерес, так как основан на Java и имеет открытый исходный код.

person Todd    schedule 22.12.2012