Ho bisogno di archiviare e di essere in grado di interrogare dati di serie temporali molto grandi.
Le proprietà dei dati sono le seguenti:
- numero di serie: circa 12.000 (dodicimila)
- numero di punti dati, a livello globale: circa 500.000.000 al mese (cinquecento milioni)
- tipi di valori misti: la maggior parte dei punti dati sono valori in virgola mobile, il resto sono stringhe
- periodo di campionamento: variabile tra serie e all'interno di una serie
- timestamp: precisione millisecondo
- Periodo di conservazione dei dati: diversi anni, senza decadimento o sottocampionamento
- gli archivi di dati devono essere costruiti quasi in tempo reale, ma è accettabile un ragionevole ritardo (~ 1 ora)
- i dati passati possono essere ricostruiti se necessario, ma a un costo elevato
- a volte, ma molto raramente, alcuni dati passati devono essere aggiornati
Proprietà delle query previste:
- la maggior parte delle query relative ai dati saranno query basate su data / ora; che vanno da un giorno a diversi mesi / anni. Il 90% + sarà interrogato sui dati più recenti
Altri requisiti:
- la soluzione deve essere libera come nella birra gratis e preferibilmente opensource
Il mio pensiero iniziale era di usare PyTables / Pandas con file HDF5 come archivio di back-end invece di un database SQL.
Domande:
-
Supponendo che PyTables / Pandas sia la "migliore" route, sarebbe meglio suddividere i dati in diversi file HDF, ognuno dei quali si estende per un dato periodo di tempo, o mettere tutto in un singolo file che sarebbe poi diventato enorme?
-
Devo andare e preferire il formato fisso o il formato tabella? Per me, il formato fisso sembra OK se tengo un file HDF al mese, in questo modo probabilmente un'intera serie si adatta RAM e I possono tagliare in-memory senza bisogno di un indice di formato tabella. Sono corretto?
E se questo è non l'approccio migliore, come dovrei strutturare questo archivio dati o quali tecnologie dovrei considerare? Non sono il primo ad occuparmi di archiviare grandi serie di dati di serie temporali, qual è l'approccio generale per risolvere questa sfida?
Altri approcci che ho considerato:
- database di array: si adattano perfettamente alle serie temporali con un periodo di campionamento costante, in quanto è sufficiente memorizzare solo le ore di inizio e di fine e il periodo di campionamento dell'array, quindi è semplice utilizzare solo i valori nell'array stesso e l'indicizzazione. Ma con periodi di campionamento variabili all'interno delle serie stesse, ho bisogno di mantenere una relazione di valore temporale più stretta, che a mio modo di vedere non è così adatta per il DBMS di array.
- database SQL standard con timestamp, paramID, valore come colonne ma per loro natura richiedono molti I / O su disco per qualsiasi query