L’efficienza di compressione di un file dipende dal contenuto: un esempio

Per verificare come l’efficienza di compressione di un file dipenda dal contenuto creiamo 3 file:

  • un file di 1GB di dati casuali (rando.txt):
  • head -c 1G </dev/urandom >rando.txt

  • un file di 1GB con la stringa pippo ripetuta (pippo.txt):
  • yes 'pippo' | tr -d '\n' | head -c 1G > pippo.txt

  • un file di 1GB con la stringa pippo-pluto ripetuta (pippo-pluto.txt):
  • yes 'pippo-pluto' | tr -d '\n' | head -c 1G > pippo-pluto.txt

Inizialmente, questi tre i file occupano esattamente 1GB:

Possiamo ispezionare i primi bite di ciascun file in formato esadecimale:

Per comprimerli basta usare i seguenti comandi:

oppure usando GNU parallel si possono lanciare i tre processi in parallelo:

I tre file compressi hanno dimensioni diverse: pippo.txt.gz e pippo-pluto.txt.gz occupano rispettivamente solamente 1.5MB e 2.0MB, mentre rando.txt.gz è aumentato di dimensione e occupa 1.1GB:

il fatto che comprimendo file con contenuto casuale sia possibile ottenere file di dimensione superiore all’originel è un fenomeno noto.

Un altro esempio: file ordinati e non ordinati

EDIT: 05 marzo 2021

Con lo script generate.sh è possibile generare due file da 1.0GB, sorted.txt e unsorted.txt, composti da due seguenze di parole (nell’esempio pippo e pluto).

sorted.txt contiene, in ordine alfabetico, prima una parola e dopo l’altra. In questo caso, la parola pippo è ripetuta 107374182 volte e così la parola pluto. Ecco i primi byte del file:

unsorted.txt contiene contiene le stesse parole[1]Questo il conteggio: $ parallel -k -v "grep -oE {2} {1} | wc -l" ::: sorted.txt unsorted.txt ::: pippo pluto grep -oE pippo sorted.txt | wc -l 107374182 grep -oE pluto sorted.txt | wc … Continue reading in ordine causuale:

Comprimiamo poi i due file:

Come previsto, il file ordinato viene compresso a una dimensione molto infieriore rispetto a quello disordinato:


L’immagine in evidenza è “gzthermal: pseudo-visualization of gzip compression efficiency” di Scott Schiller via Flickr. Rilasciata con licenza CC-BY-NC 2.0.

References

1 Questo il conteggio: $ parallel -k -v "grep -oE {2} {1} | wc -l" ::: sorted.txt unsorted.txt ::: pippo pluto
grep -oE pippo sorted.txt | wc -l
107374182
grep -oE pluto sorted.txt | wc -l
107374182
grep -oE pippo unsorted.txt | wc -l
107374182
grep -oE pluto unsorted.txt | wc -l
107374182