Memorizza una grande quantità di dati di misurazione in un piccolo spazio di archiviazione

2

Sto memorizzando dati di temperatura, tensione e corrente ogni 10 secondi in un file di registro. Questo file dovrebbe essere recuperato in seguito in modo che possiamo leggere i dati e visualizzarli. Il tempo richiesto è di 6 mesi di log e il fabbisogno di spazio è inferiore a 6 MiB.

Il protocollo che ho trovato assomiglia ad un record fisso di 6 byte:

  • PID 2 byte
  • Dati 4 byte

se PID è un timestamp i dati sono o la data (4 byte) o il tempo (4 byte). Così ho messo un timestamp e qualsiasi misura che segue in quel momento.

Ho provato a memorizzare un timestamp seguito dalle tre letture in modo lineare con record fissi, ma ho rapidamente esaurito lo spazio. Poi ho provato solo a tenere traccia delle modifiche dei valori, memorizzando l'ultimo valore e il valore corrente in caso di modifica dei dati.

Poiché la timeline è strutturata ad albero (YYMMDDhmmss), stavo pensando di ordinare i dati in una struttura ad albero ordinata su una timeline, rendendo le dimensioni del record più complesse, ma come andresti a memorizzare questi dati per un facile recupero basato sulle richieste più tardi se è conservato in un albero?

/ Modifica domande correlate qui: Come memorizzare i dati registrati con frequenza diversa ? i suggerimenti di risposta sono simili a quelli che ho trovato

    
posta Fred 15.03.2018 - 00:23
fonte

3 risposte

6

Dato che hai detto che lo spazio era un vantaggio, così tanto che ti preoccupavi del formato di timestamp, e dal momento che il tuo payload dei dati è piccolo, e stai registrando a intervalli fissi, farei i timestamp in un'intestazione che non è aggiunto ogni volta. (Dovrai immaginare questi timestamp in binario.)

Quindi piuttosto che

< timestamp > < & gt dati;

2018-03-14T23:03:00Z 01 23 45 67
2018-03-14T23:03:10Z 01 23 45 67
2018-03-14T23:03:20Z 01 23 45 67
2018-03-14T23:03:30Z 01 23 45 67
2018-03-14T23:03:40Z 01 23 45 67
2018-03-14T23:03:50Z 01 23 45 67

Potresti avere

< timestamp > < & gt dati; < & gt dati; < & gt dati; < & gt dati; < & gt dati; < & gt dati;

2018-03-14T23:03:00Z
01 23 45 67 01 23 45 67 01 23 45 67 01 23 45 67 01 23 45 67 01 23 45 67

2018-03-14T23:04:00Z
01 23 45 67 01 23 45 67 01 23 45 67 01 23 45 67 01 23 45 67 01 23 45 67

Dove ogni voce è raccolta dati in un momento diverso. Il timestamp mostra solo quando viene inserito il primo. Ciascuno viene raccolto in un momento uniformemente diviso nel tempo tra i timestamp.

Questo trucco funziona solo quando ciò che stai registrando avviene a orari prestabiliti. Quindi ti richiederebbe di inserire cose che sono registrate a ritmi diversi nei loro stessi file. Ciò presuppone che tutto venga registrato in un momento prevedibile e che non mancherà di registrare qualcosa quando è il momento di registrare i dati. Potrebbe essere necessario un valore di flag per rappresentare che i dati non sono disponibili.

La scelta di utilizzare 6 campioni di dati per timestamp è arbitraria. Maggiore è il numero di campioni per timestamp, più compatto sarà il file e maggiore sarà la seccatura di cercare particolari tempi. All'estremo opposto è possibile eliminare completamente il timestamp e lasciare che la creazione dei file e le date di aggiornamento si occupino del tempo di marcatura.

Ovviamente è possibile eseguire il rollover e la compressione dei log in modo che non sia necessario. Si tratta davvero di quale tipo di seccatura sei disposto a sopportare.

    
risposta data 15.03.2018 - 01:08
fonte
2

La soluzione usuale è quella di memorizzare solo le differenze, utilizzare una codifica a byte variabile e seguirla con un algoritmo di compressione veloce, assumendo che sia possibile conservare due file, una porzione non compressa più piccola e una porzione più grande costituita da blocchi compressi. Quando la porzione non compressa raggiunge una certa dimensione, la comprimi e la aggiungi al file compresso.

Inizia con un numero intero come la rappresentazione dei tuoi dati (può essere 16, 32, 64, qualsiasi dimensione). Mantieni come stato l'ultimo valore per questi dati. Xor questi due per ottenere il delta. Quindi registra la differenza usando qualcosa come la codifica a 7 bit, dove il bit più in alto indica se c'è un altro byte da leggere, memorizzato da LSB a MSB.

Ho usato L74 per la compressione veloce dei dati e ha funzionato molto bene. Puoi comprimere in blocchi di dimensioni fisse.

Infine quando hai bisogno di recuperare i dati, decomprimi in memoria e puoi indicizzare facilmente.

    
risposta data 17.03.2018 - 01:15
fonte
1

Hai un'idea di quanto i valori dei dati possono variare da una lettura all'altra? In tal caso, potresti essere in grado di ridurre la dimensione dei dati, a costo di non utilizzare un record di dimensioni fisse. I tuoi attuali criteri sembrano essere:

6 bytes * 6 readings/min * 60 min/hr * 24 hr/day * 30 day/mo * 6 mo = 9,331,200 bytes

ma vuoi inserirlo in 6 MiB, che è 6.291.456 byte, quindi hai bisogno di una riduzione in dimensioni 3: 2.

Se sai che la temperatura, ad esempio, non varierà di più di 5 gradi C, potresti prendere la prima lettura e memorizzarla, quindi memorizzare il delta in soli 4 bit (da -8 a +7). Allo stesso modo con tensione e corrente. Rende più difficile trovare una lettura particolare. Puoi scegliere un intervallo in cui salvare la lettura completa per renderlo più semplice (una volta all'ora o una volta al giorno, per esempio). Se tutte le letture fossero solo a temperatura, e lo faceste, avresti 6 byte per la prima lettura e 2,5 byte per ogni lettura successiva fino alla fine dell'intervallo di tempo. Diciamo che fai una scrittura completa una volta all'ora. Sarebbe venuto a:

(6 bytes + (2.5 bytes * 6 readings/min * 60 min/hr)) * 24 hr/day * 30 day/mo * 6 mo = 3,913,920 bytes

È possibile combinare ciò con la sola emissione dell'ora, una volta all'ora, per renderlo ancora più piccolo, poiché la maggior parte dei dati diventerebbe 0,5 byte invece di 2,5 byte. (Di nuovo, questo è se fossero solo i dati di temperatura e i delta sono stati limitati.)

    
risposta data 15.03.2018 - 04:10
fonte

Leggi altre domande sui tag