Мне нужно хранить и иметь возможность запрашивать некоторые очень большие объемы данных временных рядов.
Свойства данных следующие:
- количество серий: около 12.000 (двенадцать тысяч)
- количество точек данных во всем мире: около 500 000 000 в месяц (пятьсот миллионов)
- типы смешанных значений: большинство точек данных являются значениями с плавающей точкой, остальные являются строками
- период выборки: переменная между сериями, а также внутри серии
- метки времени: точность в миллисекундах
- срок хранения данных: несколько лет, без разложения или понижающей выборки
- архивы данных должны быть построены почти в реальном времени, но приемлемая задержка (~ 1 час) приемлема
- прошлые данные могут быть восстановлены при необходимости, но с высокой стоимостью
- иногда, но довольно редко, некоторые прошлые данные требуют обновления
Свойства предполагаемых запросов:
- большинство запросов к данным будет основано на метках времени; от одного дня до нескольких месяцев / лет. 90% + будут запросы по самым последним данным
Другие требования:
- решение должно быть бесплатным как в бесплатном пиве и желательно с открытым исходным кодом
Моя первоначальная мысль заключалась в том, чтобы использовать PyTables / Pandas с файлами HDF5 в качестве хранилища данных вместо базы данных SQL.
Вопросов :
Предполагая, что PyTables / Pandas - это «лучший» маршрут, было бы лучше разделить данные на несколько файлов HDF, каждый из которых охватывает определенный период времени, или поместить все в один файл, который затем станет огромным?
Должен ли я пойти и предпочесть фиксированный или табличный формат? Для меня фиксированный формат выглядит нормально, если я сохраняю один файл HDF в месяц, так как, таким образом, целая серия, вероятно, помещается в ОЗУ, и я могу разрезать в памяти, не нуждаясь в индексе формата таблицы. Я прав ?
И если это не лучший подход, как я должен структурировать это хранилище данных или какие технологии я должен рассмотреть? Я не первый, кто занимается хранением больших наборов данных временных рядов. Каков общий подход к решению этой проблемы?
Другие подходы, которые я рассмотрел:
- Базы данных массива: они превосходно подходят для временных рядов с постоянным периодом выборки, так как тогда вам нужно только сохранить время начала и окончания и период выборки массива, а затем только значения в самом массиве и индексирование легко. Но с переменными периодами выборки внутри самих рядов мне нужно поддерживать более тесное отношение timestamp-> value, которое, на мой взгляд, не очень подходит для массивов СУБД.
- стандартная база данных SQL с меткой времени, paramID, значением в виде столбцов, но по своей природе они запрашивают много дискового ввода-вывода для любого запроса