Я бы использовал дерево.
Подузел содержит значения «точность» и «среднее».
«точность» означает диапазон дат.Например: 1 минута, 10 минут, 1 день, 1 месяц и т. Д. Это также означает уровень в дереве.
«среднее» - это значение, которое наилучшим образом представляет цену для диапазона.Вы можете использовать простое среднее, линейную регрессию или все, что вы считаете «лучшим».
Так что, если вам нужно 600 баллов (скажем, вы получите размер окна), вы можете найти точность на prec=total_date_range/600
и некоторое округление к существующим диапазонам.
Теперь у вас есть «предварительная» информация, необходимая для извлечения узлов для этого «предварительного» уровня.
Будучи гигабайтами данных, я бынарезать их на объекты std :: vector.Дерево будет хранить идентификаторы для этих векторов для самых низких узлов.Остальные узлы также могут быть реализованы с помощью индексов для векторов.
Обновление с использованием новых данных требует только обновления ветви (или даже создания новой), начиная с корня, но не с таким количеством подузлов.