Devo archiviare e poter interrogare alcuni dati di serie temporali di grandi quantità.
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 le serie e all'interno di una serie
- timestamp: precisione in millisecondi
- periodo di conservazione dei dati: diversi anni, senza decadimento o downsampling
- 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 costi elevati
- a volte, ma abbastanza 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. 90% + saranno query sui dati più recenti
Altri requisiti:
- la soluzione deve essere gratuita come nella birra gratuita e preferibilmente open source
Il mio pensiero iniziale era di usare PyTables / Pandas con file HDF5 come archivio back-end anziché come database SQL.
Domande :
Supponendo che PyTables / Pandas sia il percorso "migliore", sarebbe meglio dividere i dati in diversi file HDF, ognuno in un determinato periodo di tempo, o mettere tutto in un singolo file che diventerebbe enorme?
Dovrei andare e preferire il formato fisso o tabella? Per me, il formato fisso sembra OK se mantengo un file HDF al mese, poiché in questo modo un'intera serie probabilmente si adatta alla RAM e posso tagliare in memoria senza bisogno di un indice di formato tabella. Ho ragione ?
E se questo non è l'approccio migliore, come dovrei strutturare questo archivio dati o quali tecnologie dovrei prendere in considerazione? Non sono il primo ad affrontare l'archiviazione di 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 periodo di campionamento costante, poiché è quindi necessario memorizzare solo i tempi di inizio e fine e il periodo di campionamento dell'array, quindi solo i valori nell'array stesso e l'indicizzazione sono facili. Ma con periodi di campionamento variabili all'interno delle serie stesse, ho bisogno di mantenere una relazione timestamp-> value più stretta, che a mio avviso non è adatta per il DBMS di array.
- database SQL standard con data / ora, paramID, valore come colonne ma per loro natura richiedono molto I / O su disco per qualsiasi query