Approcci per la memorizzazione e l'analisi di grandi quantità di dati basati sul tempo

4

Mi è stato chiesto di sviluppare un'applicazione di "telemetria" che registra i dati generati da un dispositivo hardware, che leggo ogni 100 ms.

Ci sono circa 250 punti dati (valori a 32 bit), ma solo un sottoinsieme di questi (ad esempio 30-50) verrà restituito ogni 100ms letti, quindi ci vorranno più letture prima che io abbia tutti i 250 dati punti. Fuori dai valori del punto dati letto, è probabile che solo un piccolo numero sia cambiato da quando sono stati letti gli stessi punti dati - alcuni cambiano ogni 100ms, altri forse ogni pochi secondi, mentre altri molto raramente (o addirittura mai).

I requisiti principali del sistema sono: -

  1. La possibilità di tracciare uno o più punti di dati nel tempo, con una risoluzione di 100 ms
  2. La possibilità di visualizzare i valori di tutti i 250 punti dati in un particolare momento
  3. L'applicazione deve memorizzare le ultime 60 ore di dati

Sto cercando alcune considerazioni sul modo migliore per affrontarlo, in particolare su come archiviare i dati in un modo che supporti la segnalazione richiesta. Finora sto virando verso questa idea: -

Gestisco un "dizionario" di tutti i 250 punti dati, aggiornando i valori dopo ogni lettura. Ogni 100 ms scrivo tutti 250 valori nel mio archivio dati. È facile da implementare e facile interrogare i dati per soddisfare i requisiti. Il rovescio della medaglia è che non è un uso particolarmente efficiente dello storage (ma hey - lo spazio su disco è economico al giorno d'oggi).

In alternativa, sempre a 100 ms, potrei memorizzare solo i valori che sono cambiati dall'ultima lettura, tuttavia questo diventa più difficile da implementare, specialmente quando si tratta di eseguire query. Per esempio. per il requisito n. 2, dovrei costruire una "istantanea" attraversando di nuovo i dati dal punto temporale richiesto, cercando l'ultimo valore memorizzato di ciascun punto di dati.

Ora ho scritto tutto questo, penso di aver risposto alla mia stessa domanda. L'approccio "scrivi tutto" sembra essere un gioco da ragazzi. Tuttavia non ho avuto esperienza di questo tipo di archiviazione e analisi dei dati di massa, quindi sarei interessato a sapere cosa pensano gli altri.

    
posta Andrew Stephens 02.07.2015 - 15:41
fonte

4 risposte

2

Quello che vuoi implementare è chiamato uno storico nel mondo industriale. Dovresti dare un'occhiata a openTSDB che è uno storico open source costruito su HBase. Ci sono anche prodotti commerciali come Wonderware Historian, GE Proficy Historian e Industrial Data Forwarder (IDF) di Kepware per Splunk. Sì, la compressione è obbligatoria per memorizzare in modo efficace tutte le tue misure. Penso che un'altra sfida sia quella di avere il valore quando non si ha una corrispondenza esatta per il timestamp. Questo può anche accadere se l'acquisizione dei tuoi 250 segnali non è perfettamente sincronizzata. È qui che entra in gioco l'interpolazione.

    
risposta data 02.09.2015 - 16:01
fonte
1

A seconda della frequenza con cui è possibile effettuare query sui dati, suggerirei: Memorizzare i dati in un formato compresso; e decomprimere i dati prima dell'interrogazione.

In alternativa, se le query sono troppo frequenti per quanto sopra: archivia i dati in formato non compresso; e comprime i dati più vecchi di 60 ore a una frequenza di tua scelta.

    
risposta data 07.07.2015 - 09:17
fonte
1

Ti suggerisco di registrare i valori dei punti dati man mano che arrivano e di segnarli con un timestamp.

timestamp  point  value
1436285231 A      0
1436285231 B      2
1436285232 A      2
...        ...     ... 

Accumulerai 270 megabyte per 60 ore di dati. Se ho ottenuto le mie stime corrette :)
((((250 * 32 bit) * 100 ms) * 36000 ms) * 60 ore) (escluso timestamp e altri dati che è necessario memorizzare)

Per velocizzare l'interfaccia utente, media i dati per intervallo minimo che consentirai nei tuoi grafici e memorizza il risultato nella cache.

    
risposta data 07.07.2015 - 18:31
fonte
0

Scrivo tutto e poi ho un lavoro programmato per cancellare i valori invariati e avere solo i punti in cui i dati cambiano.

Così:

Before:    After:
A B C D    A B C D
0 0 0 0    0 0 0 0
0 0 1 0    0 0 1 0
1 1 2 2    1 1 2 2
2 2 2 2    2 2 2 2
2 2 2 2    2 3 2 2
2 2 2 2    
2 3 2 2
    
risposta data 02.07.2015 - 19:35
fonte

Leggi altre domande sui tag