В прошлом я работал над несколькими проектами, которые включали хранение и обработку временных рядов с использованием различных методов хранения (файлы, RDBMS, базы данных NoSQL).Во всех этих проектах существенным моментом было убедиться, что образцы временных рядов хранятся последовательно на диске.Это обеспечило быстрое считывание нескольких тысяч последовательных сэмплов.
Поскольку у вас, по-видимому, имеется умеренное количество временных рядов (около 30 000), в каждом из которых содержится большое количество сэмплов (1 цена в секунду), простой, ноЭффективным подходом может быть запись каждого временного ряда в отдельный файл.Внутри файла цены упорядочены по времени.
Затем вам нужен индекс для каждого файла, чтобы вы могли быстро найти определенные моменты времени в файле и не нужно читать файл с самого начала.когда вам просто нужен определенный промежуток времени.
При таком подходе вы можете в полной мере воспользоваться преимуществами современных операционных систем, которые имеют большой файловый кэш и оптимизированы для последовательного чтения (обычно чтение вперед в файле при обнаружениипоследовательный шаблон).
Агрегирование нескольких временных рядов включает считывание определенного периода из каждого из этих файлов в память, вычисление агрегированных чисел и их запись куда-то.Чтобы полностью использовать операционную систему, прочитайте полный требуемый период каждого временного ряда один за другим и не пытайтесь читать их параллельно.Если вам нужно рассчитать длительный период, не разбивайте его на более мелкие периоды.
Вы упоминаете, что у вас есть 25 000 цен в день, когда вы уменьшаете их до одной в секунду.Мне кажется, что в таком временном ряду многие последовательные цены будут такими же, как торгуются (или даже оцениваются) немногие инструменты чаще, чем раз в секунду (если только вы не обрабатываете только акции S & P 500 и их производные).Таким образом, дополнительная оптимизация могла бы заключаться в дальнейшем сокращении ваших временных рядов путем сохранения нового образца, только когда цена действительно изменилась.
На более низком уровне файлы временных рядов могут быть организованы в виде двоичных файлов, состоящих из образцапробеги.Каждый прогон начинается с отметки времени первой цены и продолжительности пробега.После этого следуют цены в течение нескольких последовательных секунд.Смещение файла каждого прогона может быть сохранено в индексе, который может быть реализован с помощью реляционной СУБД (такой как MySQL).Эта база данных также будет содержать все метаданные для каждого временного ряда.
(Держитесь подальше от файлов, отображаемых в памяти. Они работают медленнее, поскольку не оптимизированы для последовательного доступа.)