La compressione dati è un processo che rappresenta le informazioni in modo più efficiente rispetto alla versione originale. Utilizzando appositi algoritmi, è ad esempio possibile ridurre la dimensione di un file o rendere più compatto un flusso audio-video in streaming. Varie tecniche eliminano la ridondanza nei dati o sfruttano modelli statistici per rappresentare le informazioni in modo più conciso. Zlib, zip e gzip sono formati che supportano la compressione lossless: il processo di compattazione dei dati non provoca alcuna perdita di informazioni. I dati decompressi sono identici a quelli originali.
I formati zlib, zip e gzip sono comunemente utilizzati in diversi contesti e applicazioni. Zlib è spesso utilizzato come libreria di compressione e decompressione in molteplici software. Tante applicazioni, come browser, server Web, software che integrano funzionalità di compressione/decompressione, possono fare uso della libreria Zlib per gestire dati compressi.
Gzip è ampiamente utilizzato nei sistemi Linux e Unix-like per comprimere singoli file o stream di dati. È generalmente abbinato al comando tar
per creare archivi compressi del contenuto di intere directory (file .tar.gz
). I server Web utilizzano spesso la compressione dinamica gzip per ridurre le dimensioni dei contenuti prima di inviarli ai browser, riducendo così il tempo di caricamento delle pagine Web. Lo stesso formato è usato anche per comprimere file di log o altri dati che devono essere conservati su disco in modo efficiente.
Infine, il formato Zip non ha bisogno di presentazioni: è comunemente utilizzato in Windows e in altri sistemi operativi per aprire, gestire e proteggere archivi compressi.
Cos’è e quando è nato il formato Zip
Il formato di compressione dati Zip è nato nel 1989 sotto la spinta di PKWARE e del suo fondatore Phil Katz. Chi ai tempi utilizzava il programma PKZIP sicuramente si ricorderà della nascita di questo storico formato. Di per sé lo Zip era un formato aperto mentre l’utilità PKZIP era distribuita sotto forma di shareware.
Utilizzando Zip e chiedendo la compressione del contenuto di un’intera cartella, l’archivio conserva la struttura della directory originale. Ogni file, inoltre, è individualmente compresso. C’è poi la possibilità di applicare una codifica.
Metodi di compressione
Lo Zip supporta diversi metodi di compressione dati anche se il più comune è rimasto DEFLATE. Tra quelli più utilizzati in assoluto ricordiamo ad esempio i seguenti:
- Stored (nessuna compressione): In questo metodo, i file vengono memorizzati senza alcuna compressione. Può essere utile quando si desidera semplicemente raggruppare più file in un unico archivio senza ridurre le dimensioni dei singoli file.
- DEFLATE: Il metodo di compressione più utilizzato nel caso del formato Zip. DEFLATE combina gli algoritmi di compressione di Huffman e Lempel-Ziv (LZ77) per ridurre le dimensioni dei dati.
- Bzip2: È un metodo noto per ottenere livelli di compressione più elevati rispetto a DEFLATE, ma con un costo computazionale leggermente maggiore.
- LZMA: Questo metodo utilizza l’algoritmo di compressione omonimo (Lempel-Ziv-Markov chain-Algorithm) per ottenere elevati tassi di compressione. Risulta particolarmente efficace nella compressione di file di grandi dimensioni.
- PPMd: Metodo di compressione basato sull’algoritmo di predizione di Markov con perdita. PPMd è noto per la sua efficacia nella compressione di testo.
Lo standard noto come ISO/IEC 21320-1:2015 prevede l’utilizzo del formato Zip come “contenitore”. Prevede la possibilità di creare soltanto archivi Stored (senza compressione) o generati utilizzando DEFLATE. È utilizzato per i file .JAR (Java archive file) nonché per i formati Office Open XML (.docx, .xlsx, .pptx; abbiamo visto come aprire e convertire i file DOCX), Office Document Format (.odt, .ods, .odp) ed EPUB (.epub).
In un altro articolo abbiamo visto come zippare una cartella in Windows.
Cos’è la central directory
Il formato Zip presenta una struttura chiamata “central directory“, posta alla fine del file compresso. Si tratta di un elemento che funge da elenco dettagliato di tutti i file contenuti nell’archivio, fornendo informazioni come nomi dei file, dimensioni e posizioni. La directory centrale consente una rapida consultazione, dispensando l’utente e le utilità dal dover decomprimere l’intero archivio.
La central directory è una caratteristica che offre un vantaggio significativo in termini di accesso a file specifici all’interno di un archivio Zip. La compressione separata dei file in un archivio Zip consente l’accesso casuale: si possono estrarre o visualizzare singoli file senza dover decomprimere tutto l’archivio.
Il formato gzip: cos’è
Nel 1990, il gruppo Info-Zip sviluppò autonomamente una versione portabile ed open source delle utilità di compressione e decompressione Zip. Quel lavoro offrì l’impulso per sviluppare il formato gzip, a sua volta derivato proprio dal codice DEFLATE integrato nelle utilità di Info-Zip.
I sistemi Unix utilizzavano un programma chiamato compress, che permetteva di comprimere un singolo file o stream di dati. Era basato sull’algoritmo di compressione LZW che all’epoca era oggetto di un brevetto, contestato tra diversi soggetti che vi avevano lavorato.
Con gzip divenne quindi possibile mettersi alle spalle eventuali problematiche legate alla proprietà intellettuale: Katz aveva infatti brevettato alcune specifiche implementazioni dell’algoritmo DEFLATE ma non il formato nella sua interezza. Nacque così gzip che sfruttava proprio DEFLATE per le attività di compressione e decompressione, aggiungendo l’estensione .gz
ai file “compattati”.
Le caratteristiche del formato gzip
I vantaggi di gzip erano “tangibili”: il nuovo formato assicurava un tasso di compressione migliore rispetto alla storica utilità compress ma, soprattutto, garantiva una decompressione molto veloce. Il controllo CRC-32 permetteva di verificare l’integrità dei dati assicurandosi di non introdurre errori né nella fase di compressione né in quella di decompressione.
L’utilizzo combinato dell’utility tar
permise di comprimere e decomprimere file in blocco con il formato gzip. Fu allora che divenne comune l’uso del formato .tar.gz
che è arrivato fino ai giorni nostri, sui sistemi Linux. Pardòn, GNU/Linux, come spesso sottolinea Free Software Foundation (FSF).
In generale, gzip offre una compressione migliore rispetto allo Zip perché può sfruttare la ridondanza tra i file, specialmente quando si tratta di molti elementi di piccole dimensioni. Gli archivi .tar.gz
sono i più comuni, ma ci sono anche metodi di compressione più efficaci: è facile imbattersi anche in file .tar.bz2
e .tar.xz
.
Diversamente da ciò che avviene con i file Zip, tuttavia, gli archivi .tar.gz
presuppongono una scansione sequenziale dall’inizio alla fine. Per ottenere un elenco dei file contenuti nell’archivio, è necessario operare una decompressione per poi esaminare ogni singolo file. Un approccio più cervellotico che si paga con i file compressi di grandi dimensioni che includono tanti elementi al loro interno.
Zlib, un altro formato ideato per superare le questioni di brevetti
Abbiamo brevemente citato, in precedenza, le questioni “legali” che hanno portato alla nascita del formato gzip, divenuto un punto di riferimento su Linux e sui sistemi Unix-like.
Intorno alla metà degli anni ’90 una questione simile si ripropose nel caso del formato GIF, largamente utilizzato nelle BBS (Bulletin Board System) e nel World Wide Web (inventato nel 1989 da Tim Berners-Lee, iniziava a diffondersi proprio in quel periodo). Una disputa in materia di brevetti portò alla nascita del formato PNG lossless che appunto permetteva di comprimere immagini senza perdita di informazioni.
Anche PNG utilizzava l’algoritmo DEFLATE per la compressione e, al fine di sollecitarne l’utilizzo da parte di quanti più utenti possibile, furono proposte due librerie: libpng and zlib. La prima gestiva tutte le caratteristiche del formato mentre la seconda si occupa della compressione e decompressione dei dati contenuti nelle immagini.
zlib è oggi ampiamente utilizzato per la trasmissione dei dati e per la loro memorizzazione a freddo e a caldo. Basti pensare che la maggior parte delle transazioni HTTP utilizzano proprio il formato zlib per la compressione e decompressione. La presenza della direttiva Content-Encoding: deflate
nell’intestazione di una comunicazione HTTP, conferma che server e client stanno dialogando utilizzando una compressione dati zlib.
Differenze tra algoritmi di compressione lossless e lossy
Quando si tratta di dover comprimere dei file, non è possibile permettersi alcuna perdita di dati. Diversamente, all’atto della decompressione, gli elementi precedentemente compressi risulteranno danneggiati e illeggibili.
Come abbiamo visto, la compressione lossless è un metodo che consente di ridurre le dimensioni di un file senza perdita di informazioni. I dati compressi e successivamente decompressi sono identici all’originale.
Ecco quindi che gli algoritmi lossless sono comunemente usati per comprimere, per esempio, documenti di testo e codice sorgente. Sono inoltre adatti per comprimere immagini in cui la fedeltà visiva è cruciale, come icone, schemi o grafici tecnici.
La compressione lossy riduce le dimensioni dei file eliminando alcune informazioni: il tasso di compressione è più spinto, a discapito di una piccola perdita di qualità. Per questo lo schema è largamente usato nella fotografia digitale e nello streaming multimediale (si pensi a JPEG, MP3, MP4, soltanto per limitarsi ai nomi più noti).
Credit immagine in apertura: iStock.com/Henrik5000