Если вы хотите поддерживать постоянную загрузку памяти, когда получаете все больше и больше данных, то вам придется как-то пересчитать этих данных. Это означает, что вы должны применить какую-то схему rebinning . Вы можете подождать, пока не получите определенное количество исходных данных, прежде чем начинать повторную обработку, но вы не можете полностью избежать этого.
Итак, ваш вопрос на самом деле спрашивает: «Каков наилучший способ динамического размещения моих данных»? Существует множество подходов, но если вы хотите свести к минимуму свои предположения о диапазоне или распределении значений, которые вы можете получить, тогда простой подход - это усреднить по сегментам фиксированного размера k с логарифмически распределенной шириной. Например, допустим, вы хотите хранить 1000 значений в памяти одновременно. Выберите размер для k , скажем, 100. Выберите минимальное разрешение, скажем, 1 мс. Тогда
- Первый интервал имеет значения от 0 до 1 мс (ширина = 1 мс)
- Второе ведро: 1-3 мс (w = 2 мс)
- Третье ведро: 3-7 мс (w = 4 мс)
- Четвертое ведро: 7-15 мс (w = 8 мс)
- ...
- Десятое ведро: 511-1023мс (w = 512мс)
Этот тип логарифмированного подхода аналогичен системам чанкинга, используемым в алгоритмах хеш-таблицы , используемых некоторыми файловыми системами и алгоритмами распределения памяти. Он хорошо работает, когда ваши данные имеют большой динамический диапазон.
По мере поступления новых значений вы можете выбрать способ повторной выборки в зависимости от ваших требований. Например, вы можете отслеживать скользящее среднее , использовать первый-в-первых или какой-либо другой более сложный метод. См. Алгоритм Kademlia для одного подхода (используется Bittorrent ).
В конечном счете, ребиннинг должен потерять вам некоторую информацию. Ваш выбор относительно биннинга определит особенности потери информации. Еще один способ сказать, что хранилище памяти постоянного размера подразумевает компромисс между динамическим диапазоном и точностью выборки ; как вы сделаете этот компромисс, зависит только от вас, но, как и любая проблема с выборкой, этот базовый факт не обойтись.
Если вы действительно заинтересованы в плюсах и минусах, то ни один ответ на этом форуме не может быть достаточным. Вы должны изучить теорию выборки . На эту тему доступно огромное количество исследований.
Я полагаю, что время вашего сервера будет иметь относительно небольшой динамический диапазон, поэтому более мягкое масштабирование, позволяющее более высокую выборку общих значений, может обеспечить более точные результаты.
Редактировать : Чтобы ответить на ваш комментарий, вот пример простого алгоритма биннинга.
- Вы храните 1000 значений в 10 ячейках. Таким образом, каждая ячейка содержит 100 значений. Предположим, что каждая ячейка реализована в виде динамического массива («список» в терминах Perl или Python).
Когда приходит новое значение:
- Определите, в каком хранилище он должен храниться, исходя из выбранных вами ограничений.
- Если корзина не заполнена, добавьте значение в список корзин.
- Если корзина заполнена, удалите значение в верхней части списка корзин и добавьте новое значение в конец списка корзин. Это означает, что старые значения выбрасываются со временем.
Чтобы найти 90-й процентиль, отсортируйте корзину 10. 90-й процентиль является первым значением в отсортированном списке (элемент 900/1000).
Если вам не нравится отбрасывать старые значения, вы можете вместо этого реализовать альтернативную схему. Например, когда корзина заполняется (в моем примере она достигает 100 значений), вы можете взять среднее из самых старых 50 элементов (т.е. первых 50 в списке), отбросить эти элементы, а затем добавить новый средний элемент в мусорное ведро, оставляя вас с корзиной из 51 элемента, который теперь имеет место для 49 новых значений. Это простой пример ребиннинга.
Другим примером ребиннинга является понижающая дискретизация ; например, выбрасывать каждое 5-е значение в отсортированном списке.
Надеюсь, этот конкретный пример поможет. Ключевым моментом, который нужно убрать, является то, что существует множество способов достижения алгоритма постоянного старения памяти; только вы можете решить, что является удовлетворительным, учитывая ваши требования.