Necesito almacenar y poder consultar datos de series temporales de cantidades muy grandes.
Las propiedades de los datos son las siguientes:
- Número de series: alrededor de 12.000 (doce mil)
- Número de puntos de datos, globalmente: alrededor de 500.000.000 por mes (quinientos millones)
- tipos de valores mixtos: la mayoría de los puntos de datos son valores de punto flotante, el resto son cadenas
- período de muestreo: variable entre series y dentro de una serie
- marcas de tiempo: precisión de milisegundos
- período de retención de datos: varios años, sin descomposición ni disminución de resolución
- los archivos de datos deben construirse casi en tiempo real, pero un retraso razonable (~ 1 hora) es aceptable
- los datos pasados se pueden reconstruir si es necesario, pero a un alto costo
- a veces, pero muy raramente, algunos datos pasados necesitan ser actualizados
Propiedades de las consultas previstas:
- la mayoría de las consultas contra los datos serán consultas basadas en marca de tiempo; que van desde un día hasta varios meses / años. Más del 90% serán consultas sobre los datos más recientes
Otros requerimientos:
- la solución debe ser libre como en cerveza gratis y preferiblemente de código abierto
Mi pensamiento inicial fue usar PyTables / Pandas con archivos HDF5 como almacenamiento de backend en lugar de una base de datos SQL.
Preguntas:
Suponiendo que PyTables / Pandas es la "mejor" ruta, ¿sería mejor dividir los datos en varios archivos HDF, cada uno abarcando un período de tiempo determinado, o poner todo en un solo archivo que luego se volvería enorme?
¿Debo ir y preferir el formato fijo o el formato de tabla? Para mí, el formato fijo se ve bien si mantengo un archivo HDF por mes, ya que de esta manera toda una serie probablemente cabe en la RAM y puedo cortar en la memoria sin necesidad de un índice de formato de tabla. Estoy en lo correcto ?
Y si ese no es el mejor enfoque, ¿cómo debería estructurar este almacén de datos o qué tecnologías debería considerar? No soy el primero en abordar el almacenamiento de grandes conjuntos de datos de series temporales, ¿cuál es el enfoque general para resolver este desafío?
Otros enfoques que he considerado:
- bases de datos de matriz: son ideales para series de tiempo con un período de muestreo constante, ya que solo necesita almacenar las horas de inicio y finalización y el período de muestreo de la matriz, y luego solo los valores en la matriz en sí y la indexación es fácil. Pero con períodos de muestreo variables dentro de las propias series, necesito mantener una relación de marca de tiempo más cercana-> valor, que en mi opinión no es tan buena para la matriz DBMS.
- base de datos SQL estándar con marca de tiempo, paramID, valor como columnas pero, por su naturaleza, solicitan una gran cantidad de E / S de disco para cualquier consulta
fuente