Compressione di dati in virgola mobile


26

Esistono strumenti appositamente progettati per la compressione di dati scientifici in virgola mobile?

Se una funzione è fluida, c'è ovviamente molta correlazione tra i numeri che rappresentano quella funzione, quindi i dati dovrebbero comprimersi bene. Comprimere / decomprimere i dati binari in virgola mobile non li comprime così bene. Mi chiedo se esistono metodi sviluppati appositamente per la compressione dei dati in virgola mobile.

Requisiti:

  • Compressione senza perdita di dati o possibilità di specificare un numero minimo di cifre da conservare (per alcune applicazioni doublepotrebbe essere più di quello di cui abbiamo bisogno, mentre floatpotrebbe non avere sufficiente precisione).

  • Strumento di lavoro ben collaudato (cioè non solo un documento che descrive un metodo teorico).

  • Adatto per la compressione di dati numerici 1D (come una serie temporale)

  • Cross platform (deve funzionare su Windows)

  • Deve essere veloce --- preferibilmente non molto più lento di gzip. Ho scoperto che se ho i numeri memorizzati come ASCII, gzipare il file può velocizzare la lettura e l'elaborazione (poiché l'operazione potrebbe essere associata a I / O).

Mi piacerebbe soprattutto sentire le persone che hanno effettivamente utilizzato un tale strumento.


Ciò è stato in parte ispirato dall'esistenza di FLAC , il che suggerisce che un metodo specializzato dovrebbe fare (molto?) Meglio di gzip.
Szabolcs,

Sto guardando questo adesso.
Szabolcs,

Neat. Ho intenzione di dare a questo un vortice.
meawoppl,

Risposte:


22

Prova Blosc . In molti casi è più veloce della memcopia . Pensaci un secondo. . . malvagio.

È super stabile, altamente controllato, multipiattaforma e si comporta come un campione.


oh wow, è davvero bello (e nuovo per me!)
Aron Ahmadia,

Il collegamento è interrotto. Qualche possibilità che sapresti dove si trova ora?
Alexis Wilke,

1
@AlexisWilke Ho corretto il collegamento. È stato il primo risultato in una ricerca su Google per Blosc.
Doug Lipinski,

1
Blosc è forse veloce ma il suo tasso di compressione su array float è un disastro. Con la migliore compressione che offre, si ottiene circa il 98% delle dimensioni originali. Grazie per la segnalazione in ogni caso.

La compressione su array float dipende fortemente dal contenuto. Sospetto che ci siano poche informazioni (strutturate) nei bit che stai comprimendo. Inoltre, Blosc è ancora in fase di sviluppo attivo 5 anni dopo!
meawoppl,

7

Ho ottenuto buoni risultati usando HDF5 e il suo filtro GZIP.

L'HDF5 fornisce anche un filtro SZIP che ottiene risultati migliori per alcuni set di dati scientifici.

Nella mia esperienza, la scelta delle compressioni dipende fortemente dal tipo di dati e il benchmarking è probabilmente l'unico modo per fare una buona scelta.

A proposito, i filtri di terze parti per HDF5 includono BLOSC, BZIP2, LZO, LZF, MAFISC.


Grazie per la risposta! Non ho usato molto HDF5. È corretto che l'uso del filtro gzip con il formato HDF5 mi dia lo stesso rapporto di compressione di scrivere tutto il numero in un file binario piatto ed eseguirlo tramite gzip? (Ignora la possibile praticità / inconveniente dell'utilizzo di HDF5 per ora.) Per quanto riguarda SZIP, è in qualche modo ottimizzato per i set di dati in virgola mobile? (Sono curioso e questo non è chiaro dal raschiare la pagina che hai collegato.) La pagina dice che il vantaggio principale di SZIP è la velocità. GZIP è anche piuttosto scattante (di solito la decompressione di gzip è trascurabile per me).
Szabolcs,

Un file binario piatto con compressione gzip sarà probabilmente più piccolo di un file HDF5 con filtro gzip, poiché HDF5 è più di dati non elaborati. A volte la preelaborazione con un filtro shuffle può migliorare i risultati di gzip. Ma hai ragione, i vantaggi sono in effetti piuttosto una comodità. Con HDF5 trovo facile cambiare il filtro di compressione (provare diverse impostazioni) e HDF5 fornisce la funzione per accedere a sottoinsiemi dei tuoi dati (intervalli nelle serie temporali).
f3lix,

1
Se segui questa strada dai un'occhiata a pyTables . Rende quanto sopra solo un paio di righe di codice. Gestito (almeno in precedenza) dall'autore Blosc.
meawoppl,

6

[-1,1]

A seconda della funzione sottostante, potresti essere in grado di adattare i dati a un modulo funzionale senza errori, richiedendo un minor numero di coefficienti per descrivere il modulo funzionale rispetto al punto dati (che porta alla compressione). Esistono risultati di errore per alcuni di questi metodi, anche se non so se qualcuno di loro ti darà limiti a priori (o a posteriori ) o stime sull'errore.

Potresti anche esaminare metodi sviluppati appositamente per la compressione di numeri in virgola mobile, come FPC e algoritmi correlati. Vedi i documenti qui , qui , qui , qui e qui , insieme a una pagina web contenente il vecchio codice sorgente qui .


In realtà sono interessato a strumenti già pronti simili a gzip che non richiedono alcun lavoro da parte mia, in particolare non lo sviluppo e la messa a punto del mio metodo. Inoltre, sarebbe vantaggioso avere un metodo che non richiede la lettura dell'intera memoria prima di decomprimerlo poiché potrei avere file di dati molto grandi che possono essere elaborati in sequenza (funziona con gzip, ma non se uso un Fourier trasforma, a meno che non divida i dati in pezzi da solo, complicando ancora di più il tutto) Qualcosa che presume che il mio file di dati sia solo una serie di doppi binari sarebbe eccellente.
Szabolcs,

Anche queste sono trasformazioni 1: 1 non proprio tecniche di compressione. Possono essere utilizzati per creare dati con cui un algoritmo di compressione ingenuo può fare meglio, ma autonomamente non è una soluzione.
meawoppl,

Alcuni di questi metodi costituiscono la base matematica per gli algoritmi di compressione utilizzati nell'elaborazione del segnale, che era l'idea alla base della risposta. Queste trasformazioni in genere non sono 1: 1, tranne in circostanze speciali.
Geoff Oxberry,

3

HDF5 può usare un algoritmo di "shuffling" in cui i byte per N numeri in virgola mobile vengono riorganizzati in modo che i primi byte degli N numeri vengano prima, poi il 2 ° e così via. Ciò produce rapporti di compressione migliori dopo l'applicazione di gzip, poiché è più probabile che producano sequenze più lunghe dello stesso valore. Vedi qui per alcuni benchmark .


1

SZ (sviluppato da Argonne nel 2016) potrebbe essere una buona scelta.

SZ: veloce compressore di dati a virgola mobile associato a errori per applicazioni scientifiche https://collab.cels.anl.gov/display/ESR/SZ


Perché pensi che potrebbe essere una buona scelta? Quali sono le sue capacità rispetto ad altre tecniche di compressione?
Paolo

1

Possibili metodi che possono essere utilizzati per la compressione in virgola mobile:

  • Trasposizione 4xN per float e 8xN per double + lz77
    Implementazione: compressione in virgola mobile in TurboTranspose
    vedi anche compressione con perdita di errori

  • Predittore (es. Metodo del contesto finito) + codifica (es. "Compressione intera").
    Implementazione: compressione in virgola mobile in TurboPPer
    inclusa la compressione speciale per le serie storiche .

  • quando possibile, converti tutti i numeri in virgola mobile in numeri interi (es. 1.63 -> 163), quindi usa la compressione dei numeri interi

  • Puoi testare tutti questi metodi con i tuoi dati usando lo strumento icapp per Linux e Windows.


1

Abbiamo utilizzato ZFP con HDF5 per i nostri dati di imaging medico. È fatto per una perdita di compressione, in virgola mobile.

Lo stiamo eseguendo letteralmente su tutto e abbiamo più di 40 TB di dati memorizzati (e utilizzati!). È abbastanza veloce per salvare i nostri dati in tempo reale e possiamo specificare la precisione richiesta, quindi mentre il formato è in perdita, non vediamo differenze nei nostri output finali.


0

Se una funzione è fluida, c'è ovviamente molta correlazione tra i numeri che rappresentano quella funzione, quindi i dati dovrebbero comprimersi bene.

Forse il formato richiesto deve archiviare solo gli offset dal valore al valore vicino.

In alternativa, forse potresti utilizzare il dominio della frequenza, forse anche salvare questi valori come file audio senza perdita di dati come "flac lossless", poiché hai bisogno di alcune delle stesse proprietà di un suono.

Tuttavia, ho intenzione di adottare un approccio diverso nel tentativo di rispondere alla domanda che spero possa essere di aiuto. Come quello che stai dicendo è anche che la lunghezza minima della descrizione per rappresentare questi dati è inferiore a quella di fornire tutti i punti dati.

https://en.wikipedia.org/wiki/Minimum_description_length

In effetti un programma, un codice per computer, è un buon esempio. E se non ti dispiace che qualcosa sia principalmente un dato che funziona eseguendo, e quindi anche un codice, allora potresti comprimere i tuoi valori in virgola mobile in qualcosa come una funzione o un formuli.

Fare questo particolarmente bene automaticamente e in una quantità realistica di calcolo, è oltre la difficile. Tuttavia, Wolfram Language offre alcune funzionalità per provare questo:

https://reference.wolfram.com/language/ref/FindSequenceFunction.html https://reference.wolfram.com/language/ref/FindGeneratingFunction.html https://reference.wolfram.com/language/ref/FindFormula. html

https://reference.wolfram.com/language/ref/RSolve.html


0

Perché non salvare semplicemente float32 / float16? In numpy,

A.astype( np.float32 )  # 100M: 200 msec imac
A.astype( np.float16 )  # 100M: 700 msec

Questi non funzioneranno se stai simulando effetto Butterfly nella teoria del caos, ma sono comprensibili, portatili, "non richiedono alcun lavoro da parte mia". E la compressione 2: 1/4: 1 su float64 è difficile da battere :)

Gli appunti:

"Il tipo di array float16 non è supportato in np.linalg"; dovrai espanderlo a 32 o 64 dopo averlo letto.

Per vedere in che modo differiscono i parametri in virgola mobile,

import numpy as np
for f in [np.float64, np.float32, np.float16]:
    print np.finfo(f)

Per un diagramma di un banale test case che confronta float 64 32 e 16, vedere qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.