La prima compressione Middle-Out al mondo per dati di serie temporali – Parte 1
Aggiornamento: L’algoritmo è ora sotto licenza WTFPLv2. Codici sorgente disponibili a https://github.com/schizofreny/middle-out.
La compressione middle-out non è più un’invenzione fittizia dello show Silicon Valley della HBO. Ispirati sia dallo show televisivo che dai nuovi set di istruzioni vettoriali, abbiamo sviluppato un nuovo algoritmo di compressione senza perdita di dati per le serie temporali. La compressione è sempre un compromesso tra velocità e rapporto e non è mai facile bilanciare questi compromessi, ma l’intero concetto di middle-out ci permette di spingere il punteggio di Weissman ancora oltre.
Si rompe semplicemente la dipendenza dai dati. Se abbiamo bisogno di un valore precedente per calcolarne uno attuale, abbiamo bisogno di tutti i valori antecedenti. Ma se iniziamo l’elaborazione da più posizioni del chunk, dipendiamo solo dai valori antecedenti all’interno di questo frammento. Questo ci permette, per esempio, di usare efficacemente le istruzioni SIMD.
In linea di principio, l’algoritmo calcola lo XOR di un nuovo valore e quello precedente. In questo modo otteniamo una sorta di differenza tra i valori e possiamo memorizzare solo questa differenza. Negli insiemi di dati di serie temporali questa differenza ha tipicamente un numero di zeri iniziali e/o finali. Quindi l’informazione che dobbiamo memorizzare è di solito significativamente più piccola, ma abbiamo anche bisogno di memorizzare il conteggio degli zeri iniziali e la lunghezza del frammento XOR non nullo.
Questi concetti sono generalmente utilizzati negli algoritmi di compressione attuali, ad esempio il Gorilla di Facebook. Per l’efficienza della compressione, Gorilla opera a livello di bit, ma queste operazioni sono abbastanza espansive. Abbiamo progettato la nostra compressione per essere il più veloce possibile, quindi siamo passati dalla granularità bit a quella byte. Di conseguenza, ci si aspetterebbe un rapporto di compressione peggiore, ma non è sempre così.
Per quanto riguarda il middle-out, la compressione opera su blocchi di dati, ma questo non è un problema perché i database di serie temporali utilizzano comunque dei blocchi.
Che dire del rapporto di compressione?
Esaminiamo il rapporto di compressione in due diversi scenari. Il primo scenario – prendiamo una serie di doppie (cioè 0,1, 0,2, 0,3, …) e misuriamo il rapporto di compressione a seconda della porzione di punti ripetuti. Per il confronto usiamo la compressione Gorilla di Facebook. Per impostazione predefinita Gorilla comprime sia i valori che i timestamp dei dati delle serie temporali. Per i nostri scopi di test, la compressione dei timestamp è disabilitata.