Я практически завершил один, но хотел сравнить свой с хорошо изученным, возможно, академическим алгоритмом. Может быть библиотека статистических объектов, которые либо напрямую, либо в комбинации решают мою конкретную потребность.
Моя система (которую я намереваюсь использовать с открытым исходным кодом) имеет поток данных NetFlow. Вместо того, чтобы хранить в базе данных и использовать функции SQL, я предпочитаю иметь систему без базы данных и поддерживать набор статистических данных, обновляемых для каждого нового потока и прокручиваемых в секунду (или выше).
Мое решение включает в себя единый массив uint для эффективного создания зубчатого массива размеров [60, 59, 23, 6,...], представляющего секунды, минуты, часы, дни, недели и т. д....
Каждый слот содержит общее количество байтов за это время. Таким образом, через 60 секунд создается статистика за одну минуту в виде Avg(seconds). Это, конечно, продолжается относительно вверх по временной шкале.
Вместо того, чтобы просто иметь тысячи секунд приращения, это связано с:
- Ограничения памяти и возможность иметь больше статистических узлов; А ТАКЖЕ
- Идеальная презентация для пользователей
...что я сворачиваю шкалу времени.
Учитывая, что поток может быть применен к нескольким узлам в иерархии статистики (канал WAN, IP-адрес, адрес назначения, порт-источник-порт-получателя), я вычисляю дельту один раз (GenerateDelta), а затем просто применяю к каждому узлу, который является одновременно активным и который соответствует метаданным потока.
Статистика на данном узле будет «прокручиваться» в следующих возможных случаях:
- При чтении/отображении (через запрос HTTP\JSON AJAX)
- Когда применяется дельта (из-за соответствующего потока)
- Просто каждые n секунд (n обычно равно 1)
В целом может существовать хорошо зарекомендовавший себя алгоритм для хранения промежуточных сумм с течением времени (с секундами, минутами...). Но в противном случае могут быть подходящие алгоритмы для сравнения небольших подразделов моего кода:
- GenerateDelta — маловероятно, так как это специфично для разбивки и усреднения потока с длительностью по слотам в массиве статистики.
- Прокрутка - если бы были только секунды, то это, конечно, было бы просто, однако мое решение требует, чтобы 60 секунд объединялись в новую сумму минут каждые 60 секунд и так далее.
Я не хочу, чтобы респонденты предлагали какие-либо свои собственные алгоритмы, я уже (почти) выполнил все свои собственные без каких-либо проблем и со многими соображениями производительности. И другие, вероятно, смогут взглянуть на мой алгоритм, когда я закончу и опубликую его как Open Source.
Что я действительно хочу видеть, так это любые "хорошо зарекомендовавшие себя" алгоритмы для сравнения. Может быть, моя будет лучше, может быть, моя будет хуже. Google плохо разбирается в такого рода вопросах, мне нужна ваша помощь.
Спасибо!