Мені потрібно зберігати та мати можливість запитувати деякі дуже великі обсяги даних часових рядів.
Властивості даних такі:
- кількість серій: близько 12 000 (дванадцять тисяч)
- кількість точок даних у всьому світі: близько 500 000 000 на місяць (п'ятсот мільйонів)
- змішані типи значень: більшість точок даних - це знаки з плаваючою точкою, решта - це рядки
- Період вибірки: змінна між серіями, а також у межах серії
- мітки часу: мілісекундна точність
- Період збереження даних: кілька років, без занепаду чи зниження часу
- архіви даних потрібно вбудовувати майже в режимі реального часу, але прийнятна розумна затримка (~ 1 година)
- минулі дані можна відновити за потреби, але з високою вартістю
- іноді, але досить рідко, деякі попередні дані потребують оновлення
Властивості передбачених запитів:
- більшість запитів щодо даних будуть запитами на основі часових позначок; від одного дня до декількох місяців / років. 90% + будуть запити за останніми даними
Інші вимоги:
- розчин повинен бути вільним, як у вільному пиві та бажано з відкритим кодом
Первісною моєю думкою було використання PyTables / Pandas з файлами HDF5 як зберігання бекенда замість бази даних SQL.
Запитання:
Якщо припустити, що PyTables / Pandas - це "найкращий" маршрут, то краще було б розділити дані на кілька файлів HDF, кожен з яких триває певний проміжок часу, або помістити все в один файл, який потім стане величезним?
Чи варто віддати перевагу фіксованому чи формату таблиці? Для мене фіксований формат виглядає нормально, якщо я зберігаю один файл HDF щомісяця, оскільки таким чином ціла серія, ймовірно, вміщується в оперативній пам'яті, і я можу нарізати пам'ять, не потребуючи індексу формату таблиці. Я прав?
І якщо це не найкращий підхід, як я повинен структурувати цей сховище даних або які технології я повинен розглянути? Я не перший, хто займається зберіганням великих наборів даних часових рядів, який загальний підхід до вирішення цієї проблеми?
Інші підходи, які я розглядав:
- бази даних масиву: вони чудово підходять для тимчасових рядів з постійним періодом вибірки, тому що вам потрібно лише зберігати час початку і кінця та період вибірки масиву, а потім лише значення у самому масиві та індексація є легкою. Але при змінних періодах вибірки в самих серіях мені потрібно дотримуватися більш близького співвідношення часових позначок -> значення, яке, на мій погляд, не є таким корисним для СУБД масиву.
- стандартна база даних SQL з позначкою часу, paramID, значенням як стовпці, але за своєю природою вони вимагають багато вводу-виводу диска для будь-якого запиту