ZSTD, abbreviazione di Zstandard, è un algoritmo di compressione lossless veloce ed efficiente e un formato di file sviluppato da Yann Collet su Facebook. È progettato per fornire elevati rapporti di compressione mantenendo velocità di compressione e decompressione elevate, rendendolo adatto per scenari di compressione in tempo reale e la compressione di grandi set di dati.
Il formato ZSTD si basa su una combinazione di una fase di entropia veloce e una potente fase di compressione lossless. La fase di entropia utilizza la codifica FSE (Finite State Entropy) e Huffman, mentre la fase di compressione lossless impiega una variante dell'algoritmo LZ77 chiamata Zstandard Dictionary Compression (ZDIC).
Una delle caratteristiche principali di ZSTD è la sua capacità di creare e utilizzare un dizionario durante la compressione. Il dizionario è un set di dati pre-condiviso che sia il compressore che il decompressore utilizzano per migliorare i rapporti di compressione. ZSTD supporta due tipi di dizionari: dizionari definiti dal contenuto e dizionari forniti dall'utente.
I dizionari definiti dal contenuto vengono generati automaticamente dal compressore ZSTD in base ai dati di input. Il compressore analizza i dati per identificare modelli ricorrenti e costruisce un dizionario che rappresenta questi modelli. Il dizionario viene quindi utilizzato durante la compressione per sostituire i modelli ricorrenti con riferimenti al dizionario, con conseguenti rapporti di compressione più elevati.
I dizionari forniti dall'utente, d'altra parte, vengono creati dall'utente e possono essere condivisi tra più file compressi. Questi dizionari sono utili quando si comprimono dati simili o correlati, poiché consentono al compressore di sfruttare la conoscenza preesistente dei modelli di dati. I dizionari forniti dall'utente possono migliorare significativamente i rapporti di compressione, specialmente per file di piccole dimensioni o file con strutture di dati comuni.
ZSTD supporta più livelli di compressione, da 1 a 22, con livelli più alti che offrono migliori rapporti di compressione a scapito di una velocità di compressione più lenta. Il livello di compressione predefinito è 3, che fornisce un buon equilibrio tra rapporto di compressione e velocità. ZSTD include anche uno speciale livello di compressione chiamato "ultra", che offre il rapporto di compressione più elevato ma con un aumento significativo del tempo di compressione.
Il formato ZSTD consiste in un'intestazione seguita da uno o più frame compressi. L'intestazione contiene metadati sui dati compressi, come l'ID del dizionario, la dimensione della finestra e il conteggio dei frame. Ogni frame compresso è indipendente e può essere decompresso separatamente, consentendo la decompressione parallela e l'accesso casuale ai dati compressi.
I frame compressi in ZSTD utilizzano una combinazione di blocchi letterali e blocchi di sequenza. I blocchi letterali contengono dati grezzi non compressi, mentre i blocchi di sequenza contengono riferimenti al dizionario o ai dati visti in precedenza. I blocchi di sequenza vengono codificati utilizzando la codifica FSE o Huffman per minimizzare la dimensione dei riferimenti.
ZSTD impiega diverse tecniche per migliorare l'efficienza e la velocità di compressione. Una di queste tecniche è l'uso di una tabella hash per individuare rapidamente sequenze corrispondenti nel dizionario o nei dati visti in precedenza. La tabella hash viene continuamente aggiornata mentre il compressore elabora i dati di input, consentendo una ricerca efficiente di potenziali corrispondenze.
Un'altra tecnica di ottimizzazione utilizzata da ZSTD è la strategia di corrispondenza pigra. Invece di codificare immediatamente una corrispondenza, il compressore continua a cercare corrispondenze più lunghe. Se viene trovata una corrispondenza più lunga, il compressore può scegliere di codificare invece la corrispondenza più lunga, con conseguenti migliori rapporti di compressione.
ZSTD include anche una modalità veloce chiamata "long distance matching" (LDM), che consente il rilevamento di corrispondenze a lunga distanza. LDM utilizza una tabella hash secondaria per memorizzare le corrispondenze che sono molto distanti nei dati di input. Considerando queste corrispondenze a lunga distanza, ZSTD può migliorare i rapporti di compressione per determinati tipi di dati, come dati altamente ripetitivi o periodici.
Oltre alle sue capacità di compressione, ZSTD fornisce anche rilevamento e correzione degli errori tramite l'uso di checksum. Ogni frame compresso include un checksum dei dati non compressi, consentendo al decompressore di verificare l'integrità dei dati durante la decompressione. Se viene rilevato un errore, ZSTD può tentare di recuperarlo scartando il frame danneggiato e continuando con il frame successivo.
ZSTD ha ottenuto un'ampia adozione grazie alle sue prestazioni e flessibilità impressionanti. Viene utilizzato in varie applicazioni, tra cui sistemi di archiviazione dati, motori di database, soluzioni di backup e protocolli di trasferimento dati. Molti formati di file popolari, come Zstandard Archive (ZSTD), Zstandard Seekable Format (ZST) e Zstandard Dictionary Format (ZDICT), si basano sulla compressione ZSTD.
Uno dei vantaggi di ZSTD è la sua compatibilità con un'ampia gamma di piattaforme e linguaggi di programmazione. L'implementazione di riferimento di ZSTD è scritta in C ed è altamente portabile, consentendone l'utilizzo su vari sistemi operativi e architetture. Inoltre, sono disponibili numerosi binding e port di ZSTD per diversi linguaggi di programmazione, rendendo facile integrare la compressione ZSTD nelle applicazioni esistenti.
ZSTD fornisce anche uno strumento con interfaccia a riga di comando (CLI) che consente agli utenti di comprimere e decomprimere file utilizzando ZSTD. Lo strumento CLI supporta varie opzioni e parametri, come l'impostazione del livello di compressione, la specifica del dizionario e la regolazione dell'utilizzo della memoria. Lo strumento CLI è particolarmente utile per comprimere e decomprimere file in batch o in ambienti con script.
In sintesi, ZSTD è un algoritmo di compressione e un formato di file altamente efficienti e versatili che offrono velocità di compressione e decompressione elevate, elevati rapporti di compressione e la possibilità di utilizzare dizionari per migliorare le prestazioni. La sua combinazione di velocità ed efficienza di compressione lo rende adatto per un'ampia gamma di applicazioni, dalla compressione in tempo reale alla compressione di grandi set di dati. Con il suo ampio set di funzionalità, la compatibilità con le piattaforme e la crescente adozione, ZSTD è diventata una scelta popolare per la compressione dei dati in vari domini.
La compressione dei file riduce la ridondanza in modo che le stesse informazioni occupino meno bit. Il limite superiore di quanto si può andare è governato dalla teoria dell'informazione: per la compressione senza perdita, il limite è l'entropia della fonte (vedi il teorema della codifica di sorgente di Shannon e il suo articolo originale del 1948 “Una teoria matematica della comunicazione”). Per la compressione con perdita, il compromesso tra velocità e qualità è catturato dalla teoria tasso-distorsione.
La maggior parte dei compressori ha due fasi. In primo luogo, un modello predice o espone la struttura nei dati. In secondo luogo, un codificatore trasforma tali previsioni in modelli di bit quasi ottimali. Una famiglia di modellazione classica è Lempel-Ziv: LZ77 (1977) e LZ78 (1978) rilevano sottostringhe ripetute ed emettono riferimenti invece di byte grezzi. Sul lato della codifica, la codifica di Huffman (vedi l'articolo originale del 1952) assegna codici più brevi a simboli più probabili. La codifica aritmetica e la codifica a intervalli sono alternative a grana più fine che si avvicinano al limite dell'entropia, mentre i moderni Sistemi Numerici Asimmetrici (ANS) ottengono una compressione simile con implementazioni veloci basate su tabelle.
DEFLATE (usato da gzip, zlib e ZIP) combina LZ77 con la codifica di Huffman. Le sue specifiche sono pubbliche: DEFLATE RFC 1951, wrapper zlib RFC 1950, e formato file gzip RFC 1952. Gzip è strutturato per lo streaming ed esplicitamente non tenta di fornire accesso casuale. Le immagini PNG standardizzano DEFLATE come unico metodo di compressione (con una finestra massima di 32 KiB), secondo le specifiche PNG “Metodo di compressione 0… deflate/inflate… al massimo 32768 byte” e W3C/ISO PNG 2a Edizione.
Zstandard (zstd): un compressore generico più recente progettato per rapporti elevati con decompressione molto veloce. Il formato è documentato in RFC 8878 (anche mirror HTML) e nelle specifiche di riferimento su GitHub. Come gzip, il frame di base non mira all'accesso casuale. Uno dei superpoteri di zstd sono i dizionari: piccoli campioni dal tuo corpus che migliorano drasticamente la compressione su molti file piccoli o simili (vedi documenti del dizionario python-zstandard e l'esempio funzionante di Nigel Tao). Le implementazioni accettano dizionari sia “non strutturati” che “strutturati” (discussione).
Brotli: ottimizzato per i contenuti web (ad es. font WOFF2, HTTP). Mescola un dizionario statico con un core di entropia LZ+ simile a DEFLATE. La specifica è RFC 7932, che nota anche una finestra scorrevole di 2WBITS−16 con WBITS in [10, 24] (da 1 KiB−16 B a 16 MiB−16 B) e che non tenta l'accesso casuale. Brotli spesso batte gzip sul testo web decodificando rapidamente.
Contenitore ZIP: ZIP è un archivio di file che può memorizzare voci con vari metodi di compressione (deflate, store, zstd, ecc.). Lo standard de facto è l'APPNOTE di PKWARE (vedi portale APPNOTE, una copia ospitata, e panoramiche LC Formato file ZIP (PKWARE) / ZIP 6.3.3).
LZ4 punta alla velocità grezza con rapporti modesti. Vedi la sua pagina del progetto (“compressione estremamente veloce”) e il formato del frame. È ideale per cache in memoria, telemetria o percorsi caldi in cui la decompressione deve essere quasi alla velocità della RAM.
XZ / LZMA spingono per la densità (ottimi rapporti) con una compressione relativamente lenta. XZ è un contenitore; il lavoro pesante è tipicamente svolto da LZMA/LZMA2 (modellazione simile a LZ77 + codifica a intervalli). Vedi formato file .xz, la specifica LZMA (Pavlov), e le note del kernel Linux su XZ Embedded. XZ di solito comprime meglio di gzip e spesso compete con i moderni codec ad alto rapporto, ma con tempi di codifica più lenti.
bzip2 applica la Trasformata di Burrows-Wheeler (BWT), move-to-front, RLE e la codifica di Huffman. È tipicamente più piccolo di gzip ma più lento; vedi il manuale ufficiale e le pagine man (Linux).
La “dimensione della finestra” è importante. I riferimenti DEFLATE possono guardare indietro solo di 32 KiB (RFC 1951 e il limite di 32 KiB di PNG notato qui). La finestra di Brotli varia da circa 1 KiB a 16 MiB (RFC 7932). Zstd regola la finestra e la profondità di ricerca per livello (RFC 8878). I flussi di base gzip/zstd/brotli sono progettati per la decodifica sequenziale; i formati di base non promettono l'accesso casuale, sebbene i contenitori (ad es. indici tar, framing a blocchi o indici specifici del formato) possano stratificarlo.
I formati di cui sopra sono senza perdita: è possibile ricostruire i byte esatti. I codec multimediali sono spesso con perdita: scartano dettagli impercettibili per raggiungere bitrate più bassi. Nelle immagini, il JPEG classico (DCT, quantizzazione, codifica entropica) è standardizzato in ITU-T T.81 / ISO/IEC 10918-1. Nell'audio, MP3 (MPEG-1 Layer III) e AAC (MPEG-2/4) si basano su modelli percettivi e trasformate MDCT (vedi ISO/IEC 11172-3, ISO/IEC 13818-7, e una panoramica MDCT qui). Con perdita e senza perdita possono coesistere (ad es. PNG per le risorse dell'interfaccia utente; codec Web per immagini/video/audio).
Teoria: Shannon 1948 · Velocità-distorsione · Codifica: Huffman 1952 · Codifica aritmetica · Codifica a intervalli · ANS. Formati: DEFLATE · zlib · gzip · Zstandard · Brotli · LZ4 frame · Formato XZ. Stack BWT: Burrows–Wheeler (1994) · manuale bzip2. Media: JPEG T.81 · MP3 ISO/IEC 11172-3 · AAC ISO/IEC 13818-7 · MDCT.
In conclusione: scegli un compressore che si adatti ai tuoi dati e ai tuoi vincoli, misura su input reali e non dimenticare i vantaggi derivanti dai dizionari e dal framing intelligente. Con la giusta accoppiata, puoi ottenere file più piccoli, trasferimenti più veloci e app più scattanti, senza sacrificare la correttezza o la portabilità.
La compressione dei file è un processo che riduce le dimensioni di un file o di più file, tipicamente per risparmiare spazio di archiviazione o accelerare la trasmissione su una rete.
La compressione dei file funziona identificando e rimuovendo la ridondanza nei dati. Utilizza algoritmi per codificare i dati originali in uno spazio minore.
I due principali tipi di compressione dei file sono la compressione senza perdita e la compressione con perdita. La compressione senza perdita permette di ripristinare perfettamente il file originale, mentre la compressione con perdita consente una riduzione di dimensioni più significativa a costo di una certa perdita nella qualità dei dati.
Un esempio popolare di uno strumento di compressione dei file è WinZip, che supporta più formati di compressione tra cui ZIP e RAR.
Con la compressione senza perdita, la qualità rimane inalterata. Tuttavia, con la compressione con perdita, può esserci una diminuzione notevole della qualità perché elimina dati meno importanti per ridurre più significativamente la dimensione del file.
Sì, la compressione dei file è sicura in termini di integrità dei dati, specialmente con la compressione senza perdita. Tuttavia, come qualsiasi file, i file compressi possono essere presi di mira da malware o virus, quindi è sempre importante avere in atto un software di sicurezza affidabile.
Quasi tutti i tipi di file possono essere compressi, inclusi file di testo, immagini, audio, video e software. Tuttavia, il livello di compressione ottenibile può variare significativamente tra i tipi di file.
Un file ZIP è un tipo di formato di file che utilizza la compressione senza perdita per ridurre le dimensioni di uno o più file. Più file in un file ZIP sono effettivamente raggruppati insieme in un unico file, il che facilita anche la condivisione.
Tecnicamente, sì, anche se la riduzione aggiuntiva delle dimensioni potrebbe essere minima o addirittura controproducente. Comprimere un file già compresso potrebbe a volte aumentare le sue dimensioni a causa dei metadati aggiunti dall'algoritmo di compressione.
Per decomprimere un file, di solito ti serve uno strumento di decompressione o di estrazione, come WinZip o 7-Zip. Questi strumenti possono estrarre i file originali dal formato compresso.