Perché Zip è in grado di comprimere singoli file meglio di più file con lo stesso contenuto?

0
74

Essere in grado di comprimere i nostri file in modo che sia più facile condividerli e / o trasportarli può rendere le nostre vite elettroniche molto più facili, ma a volte potremmo vedere risultati di dimensionamento strani o imprevisti dopo averli compressi. Perché? Il post di domande e risposte di SuperUser di oggi contiene le risposte alle domande di un lettore confuso.

La sessione di domande e risposte di oggi ci viene fornita da SuperUser, una suddivisione di Stack Exchange, un raggruppamento di siti Web di domande e risposte guidato dalla community.

Foto per gentile concessione di Jean-Etienne Minh-Duy Poirrier (Flickr).

La domanda

Il lettore SuperUser sixtyfootersdude vuole sapere perché zip è in grado di comprimere i singoli file meglio di più file con lo stesso tipo di contenuto:

Supponiamo di avere 10.000 file XML e di volerli inviare a un amico. Prima di inviarli, vorrei comprimerli.

Metodo 1: non comprimerli

risultati:

zip-impacchi-single-file-migliori-multiple-files-con-stesso-content-01-di

Metodo 2: comprimere ogni file separatamente e inviargli 10.000 file XML compressi

Comando:

zip-impacchi-single-file-migliori-multiple-files-con-stesso-content-02-di

risultati:

zip-impacchi-single-file-migliori-multiple-files-con-stesso-content-03-di

Metodo 3: Creare un singolo file zip contenente tutti i 10.000 file XML

Comando:

zip-impacchi-single-file-migliori-multiple-files-con-stesso-content-04-di

risultati:

zip-impacchi-single-file-migliori-multiple-files-con-stesso-content-05-di

Metodo 4: concatenare i file in un singolo file e comprimerlo

Comando:

zip-impacchi-single-file-migliori-multiple-files-con-stesso-content-06-di

risultati:

zip-impacchi-single-file-migliori-multiple-files-con-stesso-content-07-di

Domande

  • Perché ottengo risultati così incredibilmente migliori quando sto solo comprimendo un singolo file?
  • Mi aspettavo di ottenere risultati drasticamente migliori usando il metodo 3 anziché il metodo 2, ma non lo faccio. Perchè è questo?
  • Questo comportamento è specifico di zip? Se provassi ad usare Gzip, otterrei risultati diversi?

Informazioni addizionali

zip-impacchi-single-file-migliori-multiple-files-con-stesso-content-08-di

Meta Data

Una delle risposte fornite suggerisce che la differenza sono i metadati di sistema memorizzati nel file zip. Non credo che questo possa essere il caso. Per testarlo, ho fatto quanto segue:

zip-impacchi-single-file-migliori-multiple-files-con-stesso-content-09-di

Il file zip risultante è 1,4 MB. Ciò significa che ci sono ancora circa dieci MB di spazio inspiegabile.

Perché zip è in grado di comprimere singoli file meglio di più file con lo stesso tipo di contenuto?

La risposta

I collaboratori di SuperUser Alan Shutko e Aganju hanno la risposta per noi. Innanzitutto, Alan Shutko:

La compressione zip si basa su schemi ripetitivi nei dati da comprimere e la compressione migliora quanto più lungo è il file, poiché è possibile trovare e utilizzare sempre più schemi più lunghi.

Semplificato, se comprimi un file, il dizionario che mappa i codici (brevi) su modelli (più lunghi) è necessariamente contenuto in ogni file zip risultante; se comprimi un file lungo, il dizionario viene “riutilizzato” e diventa ancora più efficace su tutto il contenuto.

Se i tuoi file sono anche un po 'simili (come sempre è il testo), il riutilizzo del “dizionario” diventa molto efficiente e il risultato è un file zip totale molto più piccolo.

Seguita dalla risposta di Aganju:

In zip, ogni file è compresso separatamente. È l'opposto compressione solida, cioè i file vengono compressi insieme. 7-zip e Rar utilizzano una compressione solida per impostazione predefinita. Gzip e Bzip2 non possono comprimere più file, quindi Tar viene usato per primo, con lo stesso effetto della compressione solida.

Poiché i file xml hanno una struttura simile (e probabilmente un contenuto simile), se i file vengono compressi insieme, la compressione sarà maggiore.

Ad esempio, se un file contiene la stringa “<nome elemento =“E il compressore ha già trovato quella stringa in un altro file, lo sostituirà con un piccolo puntatore alla corrispondenza precedente. Se il compressore non utilizza una compressione solida, la prima occorrenza della stringa nel file verrà registrata come letterale, che è più grande.


Hai qualcosa da aggiungere alla spiegazione? Audio disattivato nei commenti. Vuoi leggere altre risposte da altri utenti esperti di Stack Exchange? Dai un'occhiata al thread completo di discussione qui.

LEAVE A REPLY

Please enter your comment!
Please enter your name here