J'ai besoin de stocker et de pouvoir interroger des données de séries chronologiques de très grandes quantités.
Les propriétés des données sont les suivantes:
- nombre de séries: environ 12.000 (douze mille)
- nombre de points de données, globalement: environ 500.000.000 par mois (cinq cent millions)
- types de valeurs mixtes: la majorité des points de données sont des valeurs à virgule flottante, les autres sont des chaînes
- période d'échantillonnage: variable entre les séries ainsi qu'au sein d'une série
- horodatage: précision en millisecondes
- période de conservation des données: plusieurs années, sans décroissance ni sous-échantillonnage
- les archives de données doivent être construites presque en temps réel, mais un délai raisonnable (~ 1 heure) est acceptable
- les données passées peuvent être reconstruites si nécessaire, mais à un coût élevé
- parfois, mais assez rarement, certaines données antérieures doivent être mises à jour
Propriétés des requêtes envisagées:
- la plupart des requêtes sur les données seront des requêtes basées sur l'horodatage; allant d'un jour à plusieurs mois / années. 90% + seront des requêtes sur les données les plus récentes
Autres exigences:
- la solution doit être libre comme dans la bière gratuite et de préférence opensource
Ma pensée initiale a été d'utiliser PyTables / Pandas avec des fichiers HDF5 comme stockage de backend au lieu d'une base de données SQL.
Des questions :
En supposant que PyTables / Pandas est la "meilleure" route, serait-il préférable de diviser les données en plusieurs fichiers HDF, chacun s'étendant sur une période de temps donnée, ou de tout mettre dans un seul fichier qui deviendrait alors énorme?
Dois-je aller préférer le format fixe ou le format tableau? Pour moi, le format fixe semble OK si je garde un fichier HDF par mois, car de cette façon, toute une série tient probablement dans la RAM et je peux découper en mémoire sans avoir besoin d'un index de format de table. Ai-je raison ?
Et si ce n'est pas la meilleure approche, comment dois-je structurer ce magasin de données ou quelles technologies dois-je envisager? Je ne suis pas le premier à aborder le stockage de grands ensembles de données de séries chronologiques, quelle est l'approche générale pour résoudre ce défi?
Autres approches que j'ai envisagées:
- bases de données de tableaux: ils conviennent parfaitement aux séries chronologiques avec une période d'échantillonnage constante, car vous n'avez alors qu'à stocker les heures de début et de fin et la période d'échantillonnage du tableau, puis seules les valeurs dans le tableau lui-même et l'indexation sont faciles. Mais avec des périodes d'échantillonnage variables dans les séries elles-mêmes, je dois garder une relation d'horodatage-> valeur plus étroite, qui, à mon avis, n'est pas si adaptée aux SGBD de tableau.
- base de données SQL standard avec horodatage, paramID, valeur sous forme de colonnes mais de par leur nature, ils demandent beaucoup d'E / S disque pour toute requête