Proč je Zip schopen složit jednotlivé soubory lépe než více souborů se stejným obsahem?
Díky tomu, že je možné komprimovat soubory, abychom je mohli jednodušeji sdílet a přepravovat, může naše elektronické životy mnohem jednodušší, ale někdy můžeme po komprimaci vidět i liché nebo neočekávané výsledky. Proč je to tak? Dnešní příspěvek SuperUser Q & A má odpovědi na zmatené otázky čtenáře.
Dnešní zasedání Otázky a odpovědi nás přichází s laskavým svolením SuperUser - podřízené rozdělení Stack Exchange, které je založeno na komunitě prostřednictvím skupin webových stránek.
Foto s laskavým svolením Jean-Etienne Minh-Duy Poirrier (Flickr).
Otázka
Čtečka SuperUser sixtyfootersdude chce vědět, proč je zip schopen komprimovat jednotlivé soubory lépe než více souborů se stejným typem obsahu:
Předpokládejme, že mám 10 000 souborů XML a chci je poslat kamarádovi. Před odesláním je rád komprimuje.
Metoda 1: Nekomprimujte je
Výsledek:
Metoda 2: Zadejte každý soubor samostatně a odešlete mu 10 000 souborů XML se zipem
Příkaz:
Výsledek:
Metoda 3: Vytvořte jeden soubor ZIP obsahující všechny 10 000 souborů XML
Příkaz:
Výsledek:
Metoda 4: Zřetězit soubory do jednoho souboru a Zip it
Příkaz:
Výsledek:
Otázky
- Proč dostanu tak dramaticky lepší výsledky, když jen zipuji jediný soubor?
- Očekával jsem drasticky lepší výsledky pomocí metody 3 spíše než metody 2, ale ne. Proč je to?
- Je toto chování specifické pro zip? Pokud jsem se snažil používat Gzip, získal bych různé výsledky?
Doplňující informace
Meta data
Jedna z uvedených odpovědí naznačuje, že rozdíl je systémová meta data, která je uložena v souboru zip. Nemyslím si, že by tomu tak mohlo být. Pro otestování jsem udělal následující:
Výsledný soubor zip je 1,4 MB. To znamená, že stále existuje přibližně deset MB nevysvětlitelného prostoru.
Proč je zip schopen komprimovat jednotlivé soubory lépe než více souborů se stejným typem obsahu?
Odpověď
Příznivci SuperUser Alan Shutko a Aganju nám mají odpověď. První, Alan Shutko:
Zip komprese je založena na opakující se vzory v datech, které mají být komprimovány, a komprese je lepší, čím déle je soubor, tím více a delší vzory mohou být nalezeny a používány.
Zjednodušené, pokud komprimujete jeden soubor, slovník, který mapuje (krátké) kódy na (delší) vzory, je nutně obsažen v každém výsledném souboru zip; pokud zkopírujete jeden dlouhý soubor, slovník se znovu používá a roste ještě účinněji v celém obsahu.
Pokud jsou vaše soubory dokonce trochu podobné (jako text vždy), opětovné použití "slovníku" se stává velmi efektivním a výsledkem je mnohem menší soubor s celkovým zipem.
Následuje odpověď od Aganju:
Ve zipu je každý soubor komprimován samostatně. Opačný je pevná komprese, to znamená, že soubory jsou komprimovány dohromady. 7-zip a Rar ve výchozím nastavení používají pevnou kompresi. Gzip a Bzip2 nemohou komprimovat více souborů, takže je nejdříve používán Tar, který má stejný efekt jako pevná komprese.
Vzhledem k tomu, že soubory XML mají podobnou strukturu (a pravděpodobně podobný obsah), pokud jsou soubory komprimovány, komprese bude vyšší.
Například pokud soubor obsahuje řetězec "
"A kompresor již nalezl řetězec v jiném souboru, nahradí ho malým ukazatelem na předchozí zápas. Pokud kompresor nepoužívá pevnou kompresi, bude první výskyt řetězce v souboru zaznamenán jako a doslovný, což je větší.
Musíte něco přidat k vysvětlení? Vyjměte v komentářích. Chcete se dozvědět více odpovědí od ostatních uživatelů technologie Stack Exchange? Podívejte se na celý diskusní příspěvek zde.