Если вы хотите, чтобы использование памяти оставалось постоянным по мере того, как вы получаете все больше и больше данных, вам понадобится как-нибудь пересчитать эти данные. Это означает, что вы должны применить какую-то схему ребининга. Вы можете подождать, пока не наберете определенное количество необработанных входных данных, прежде чем начинать ребинирование, но вы не можете полностью этого избежать.
Итак, ваш вопрос действительно спрашивает: «Как лучше всего динамически объединить мои данные»? Существует множество подходов, но если вы хотите минимизировать свои предположения о диапазоне или распределении значений, которые вы можете получить, тогда простой подход состоит в усреднении по сегментам фиксированного размера k с логарифмически распределенной шириной. . Например, допустим, вы хотите хранить в памяти 1000 значений одновременно. Выберите размер k, например 100. Выберите минимальное разрешение, например 1 мс. потом
- Первый сегмент имеет дело со значениями от 0 до 1 мс (ширина = 1 мс).
- Вторая корзина: 1-3 мс (w = 2 мс)
- Третий сегмент: 3-7 мс (w = 4 мс)
- Четвертый блок: 7-15 мс (w = 8 мс)
- ...
- Десятый сегмент: 511-1023 мс (w = 512 мс)
Этот тип подхода с масштабированием в логарифмическом масштабе аналогичен системам разделения на части, используемым в алгоритмы хэш-таблицы, используемые некоторыми файловыми системами и алгоритмами распределения памяти. Он хорошо работает, когда ваши данные имеют большой динамический диапазон.
По мере поступления новых значений вы можете выбрать способ повторной выборки в зависимости от ваших требований. Например, вы можете отслеживать скользящую среднюю, используя first-in-first-out или другой более сложный метод. См. Алгоритм Kademlia для одного подхода (используемый Bittorrent).
В конечном итоге ребининг должен потерять некоторую информацию. Ваш выбор в отношении биннинга определит особенности того, какая информация будет потеряна. Другими словами, хранилище памяти постоянного размера подразумевает компромисс между динамическим диапазоном и точность выборки; как вы пойдете на этот компромисс, зависит от вас, но, как и с любой проблемой выборки, от этого основного факта никуда не деться.
Если вас действительно интересуют плюсы и минусы, то ответа на этом форуме будет недостаточно. Вам следует изучить теорию выборки. По этой теме доступно огромное количество исследований.
Как бы то ни было, я подозреваю, что время вашего сервера будет иметь относительно небольшой динамический диапазон, поэтому более мягкое масштабирование, позволяющее более высокую выборку общих значений, может обеспечить более точные результаты.
Изменить: чтобы ответить на ваш комментарий, вот пример простого алгоритма биннинга.
- Вы храните 1000 значений в 10 ячейках. Таким образом, каждая ячейка содержит 100 значений. Предположим, что каждая корзина реализована как динамический массив («список» в терминах Perl или Python).
Когда приходит новое значение:
- Determine which bin it should be stored in, based on the bin limits you've chosen.
- Если корзина не заполнена, добавьте значение в список корзин.
- Если корзина заполнена, удалите значение в верхней части списка ящиков и добавьте новое значение в конец списка ящиков. Это означает, что старые ценности со временем выбрасываются.
Чтобы найти 90-й процентиль, отсортируйте интервал 10. 90-й процентиль - это первое значение в отсортированном списке (элемент 900/1000).
Если вам не нравится выбрасывать старые значения, вы можете использовать альтернативную схему. Например, когда корзина заполняется (в моем примере достигает 100 значений), вы можете взять среднее значение из 50 самых старых элементов (т.е. первых 50 в списке), отбросить эти элементы, а затем добавить новый элемент среднего значения к корзина, в результате чего остается корзина из 51 элемента, в которой теперь есть место для хранения 49 новых значений. Это простой пример ребининга.
Другой пример ребининга - даунсэмплинг; например, выбросить каждое 5-е значение в отсортированном списке.
Надеюсь, этот конкретный пример поможет. Ключевым моментом является то, что существует множество способов достижения алгоритма постоянного старения памяти; только вы можете решить, что является удовлетворительным с учетом ваших требований.
person
ire_and_curses
schedule
08.08.2009