Если вы хотите сохранить постоянное использование памяти, поскольку получаете все больше данных, тогда вам нужно будет resample, что данные как-то. Это означает, что вы должны применить какую-то схему rebinning. Вы можете подождать, пока вы не приобретете определенное количество сырых входов, прежде чем начинать реинжиниринг, но вы не можете полностью его избежать.
Итак, ваш вопрос действительно задает вопрос: «Каков наилучший способ динамического разбиения моих данных»? Существует много подходов, но если вы хотите свести к минимуму свои предположения о диапазоне или распределении значений, которые вы можете получить, то простой подход заключается в среднем по ковшим фиксированного размера k с логарифмически распределенной шириной. Например, скажем, вы хотите сохранить 1000 значений в памяти в любой момент времени. Выберите размер для k, скажем 100. Выберите минимальное разрешение, скажем, 1 мс. Затем
- Первый ковш имеет дело со значениями между 0-1ms (ширина = 1 мс)
- Второй Ковш: 1-3ms (W = 2 мс)
- Третье ведро: 3-7ms (ш = 4 мс)
- Четвертый ковш: 7-15ms (ш = 8ms)
- ...
- Десятый ведро: 511-1023ms (ш = 512ms)
Этот тип log-scaled подход подобен системам коммутации, используемым в hash table algorithms, который используется некоторыми файловыми системами и алгоритмами распределения памяти. Он хорошо работает, когда ваши данные имеют большой динамический диапазон.
По мере ввода новых значений вы можете выбрать, как вы хотите выполнить повторную выборку, в зависимости от ваших требований. Например, вы можете отслеживать moving average, использовать first-in-first-out или какой-либо другой более сложный метод.См. Алгоритм Kademlia для одного подхода (используется Bittorrent).
В конечном счете, восстановление должно потерять вам некоторую информацию. Ваш выбор в отношении биннинга определит, какая информация будет потеряна. Другой способ сказать это, что постоянное хранилище памяти размера подразумевает компромисс между dynamic range и sampling fidelity; как вы делаете этот компромисс, зависит от вас, но, как и любая проблема с выборкой, об этом основном факте не обойтись.
Если вы действительно заинтересованы в плюсах и минусах, то ответа на этот форум не может быть достаточно. Вы должны посмотреть на sampling theory. Существует огромное количество исследований по этой теме.
Для чего стоит, я подозреваю, что время вашего сервера будет иметь относительно небольшой динамический диапазон, поэтому более расслабленное масштабирование, позволяющее более высокую выборку общих значений, может обеспечить более точные результаты.
Редактировать: Чтобы ответить на ваш комментарий, приведен пример простого алгоритма биннинга.
- Вы сохраняете 1000 значений в десяти бункерах. Поэтому каждый бит содержит 100 значений. Предположим, что каждый бит реализован как динамический массив («список», в терминах Perl или Python).
Когда новое значение приходит в:
- Определите, какой бин он должен храниться в, исходя из пределов бинов, которые вы выбрали.
- Если контейнер не заполнен, добавьте его в список bin.
- Если контейнер заполнен, удалите значение в верхней части списка bin и добавьте новое значение в конец списка bin. Это означает, что старые значения сбрасываются со временем.
Чтобы найти 90-й процентили, сортировать корзину 10. 90-й процентиль является первым значением в отсортированном списке (элемент 900/1000).
Если вам не нравится выбрасывать старые значения, вы можете реализовать вместо этого альтернативную схему. Например, когда бит заполняется (в моем примере достигает 100 значений), вы можете взять среднее из старейших 50 элементов (т.е. первых 50 в списке), отбросить эти элементы и затем добавить новый средний элемент в ящик, оставляя вас с бункером из 51 элемента, который теперь имеет место для хранения 49 новых значений. Это простой пример воссоздания.
Другим примером перестройки является downsampling; например, выбрасывание каждого пятого значения в отсортированном списке.
Надеюсь, этот конкретный пример поможет. Ключевым моментом, который следует убрать, является то, что существует множество способов достижения постоянного алгоритма старения памяти; только вы можете решить, что удовлетворительно, учитывая ваши требования.
Я не знаю. Этот алгоритм замены, по-видимому, будет явно предвзято относиться к старым данным. Вот почему я действительно ценю правильный математический аргумент в пользу устойчивости любого решения. –
Если данные в реальном времени взяты из некоторого распределения D, то поддискретизация - любая поддискретизация - также будет выводиться из D. Если вместо этого данные из живой информации не будут взяты из какого-либо распределения, тогда список процентовлистов может быть не самым просветительским искать. – redtuna
Ключевые слова являются полезными .. Поиск «квантиль» и «поток» воспитывают все виды исследований на эту тему! Все методы кажутся намного более привлекательными, чем любой из предложенных здесь алгоритмов. Вот почему я не решаюсь отметить что-либо как «ответ». –