Я хотел бы иметь эффективный способ подсчета (приблизительного) количества повторяющихся событий за определенный период времени.Приблизительное количество событий за данный период времени
Пример: Я пытаюсь повторно загрузить файл с хоста. Обычно он работает нормально, но иногда происходит ошибка при переполнении сети. Меня не волнуют эти одиночные ошибки. Каждый раз в то время, хотя хост отключен, все мои попытки терпят неудачу. В этом случае я хотел бы автоматически остановить свою программу от повторной попытки.
Поэтому мне нужно выяснить, сколько ошибок произошло за последние x минут. Когда число ниже определенного порога, ничего не происходит. Когда он выше, я хочу принять меры. Счет не должен быть на 100% точным, только достаточно точным, чтобы сообщить мне, был ли достигнуто пороговое значение.
Простой, но неэффективный (O(n)
) способ сделать это будет просто хранить временные метки событий, а затем для каждого нового события определять количество предыдущих событий путем итерации по ним и сравнения временных меток (вверх пока не достигнут временной интервал). [в сторону] Я предполагаю, что это то, что делают SQL-машины для WHERE timestamp BETWEEN NOW() AND INTERVAL X MINUTES
, если у них нет индекса в столбце. [/ aside]
Я хочу решение с постоянной (O(1)
) сложностью. Пока я думаю, что я буду держать счетчик события, который увеличивается на 1 с каждым событием. Я также сохраню временную метку самого последнего события. Затем, когда происходит новое событие, с помощью некоторой математической магии я могу уменьшить счетчик, используя текущее время и сохраненную метку времени, чтобы отразить примерно количество событий за последние x минут.
К сожалению, мои математические навыки не соответствуют задаче. Может кто-нибудь дать некоторые подсказки?
Связанные - [Проектировать структура данных, чтобы возвратить число подключения к веб-серверу за последние 1 минуту] (http://stackoverflow.com/a/18396955/1711796). Вы можете использовать подход на основе очереди, если интервал фиксирован. Если для интервала имеется небольшое количество опций, вы можете иметь несколько указателей в очереди, по одному для каждого интервала.Или подход, основанный на подсчете, должен работать. – Dukeling
Является ли это «X минут» постоянным для конкретного запуска программы? Или вы иногда захотите узнать, сколько ошибок произошло за последние 10 минут, а в других случаях - узнать, сколько ошибок произошло за последние 30 минут? –
x - постоянная. Тем не менее, существует необходимость отслеживать различные типы событий по отдельным разным временным рамкам. –