Startpagina » hoe » Waarom is Zip in staat om afzonderlijke bestanden beter te comprimeren dan meerdere bestanden met dezelfde inhoud?

    Waarom is Zip in staat om afzonderlijke bestanden beter te comprimeren dan meerdere bestanden met dezelfde inhoud?

    Doordat we onze bestanden kunnen comprimeren zodat het gemakkelijker is ze te delen en / of te vervoeren, kunnen onze elektronische levens veel eenvoudiger worden, maar soms kunnen we oneven of onverwachte dimensioneringsresultaten zien nadat we ze hebben gecomprimeerd. Waarom is dat? De SuperUser Q & A-post van vandaag biedt de antwoorden op de vragen van een verwarde lezer.

    De Question & Answer-sessie van vandaag komt tot ons dankzij SuperUser - een onderdeel van Stack Exchange, een gemeenschapsgedreven groep van Q & A-websites.

    Foto met dank aan Jean-Etienne Minh-Duy Poirrier (Flickr).

    De vraag

    SuperUser-lezer sixtyfootersdude wil weten waarom zip enkele bestanden beter kan comprimeren dan meerdere bestanden met hetzelfde type inhoud:

    Stel dat ik 10.000 XML-bestanden heb en deze naar een vriend wil sturen. Voordat ik ze verzend, wil ik ze graag comprimeren.

    Methode 1: Niet comprimeren

    resultaten:

    Methode 2: elk bestand apart inpakken en hem 10.000 XML-bestanden met rits verzenden

    Commando:

    resultaten:

    Methode 3: Maak een enkel zip-bestand met alle 10.000 XML-bestanden

    Commando:

    resultaten:

    Methode 4: de bestanden samenvoegen tot één bestand en deze zip-in

    Commando:

    resultaten:

    vragen

    • Waarom krijg ik zulke dramatisch betere resultaten als ik slechts een enkel bestand aan het zippen ben??
    • Ik verwachtte drastisch betere resultaten te krijgen met methode 3 dan met methode 2, maar dat doe ik niet. Waarom is dit?
    • Is dit gedrag specifiek voor zip? Als ik Gzip probeerde te gebruiken, zou ik andere resultaten krijgen?

    Extra informatie

    Meta Data

    Een van de gegeven antwoorden suggereert dat het verschil de metadata van het systeem is die in het zipbestand is opgeslagen. Ik geloof niet dat dit het geval kan zijn. Om het te testen, deed ik het volgende:

    Het resulterende zipbestand is 1,4 MB. Dit betekent dat er nog steeds ongeveer tien MB onverklaarde ruimte is.

    Waarom is zip in staat om afzonderlijke bestanden beter te comprimeren dan meerdere bestanden met hetzelfde type inhoud?

    Het antwoord

    Bijdragers van SuperUser Alan Shutko en Aganju hebben het antwoord voor ons. Ten eerste, Alan Shutko:

    Zip-compressie is gebaseerd op repetitieve patronen in de gegevens die moeten worden gecomprimeerd en de compressie wordt beter naarmate het bestand langer is, omdat steeds meer patronen kunnen worden gevonden en gebruikt..

    Vereenvoudigd, als u één bestand comprimeert, is het woordenboek dat (korte) codes toewijst aan (langere) patronen noodzakelijkerwijs opgenomen in elk resulterend zipbestand; als je een lang bestand zip, wordt het woordenboek 'hergebruikt' en wordt het nog effectiever voor alle inhoud.

    Als uw bestanden zelfs een beetje vergelijkbaar zijn (zoals tekst altijd is), wordt hergebruik van het 'woordenboek' zeer efficiënt en het resultaat is een veel kleiner totaal zipbestand.

    Gevolgd door het antwoord van Aganju:

    In zip wordt elk bestand afzonderlijk gecomprimeerd. Het tegenovergestelde is stevige compressie, dat wil zeggen dat bestanden samen worden gecomprimeerd. 7-zip en Rar gebruiken standaard vaste compressie. Gzip en Bzip2 kunnen niet meerdere bestanden comprimeren, dus Tar wordt eerst gebruikt, met hetzelfde effect als vaste compressie.

    Omdat xml-bestanden een vergelijkbare structuur hebben (en waarschijnlijk vergelijkbare inhoud), als de bestanden samen worden gecomprimeerd, zal de compressie hoger zijn.

    Als een bestand bijvoorbeeld de tekenreeks bevat ""En de compressor heeft die string al gevonden in een ander bestand, het zal het vervangen door een kleine wijzer naar de vorige match. Als de compressor geen vaste compressie gebruikt, wordt de eerste keer dat de tekenreeks in het bestand wordt opgenomen als een letterlijk, welke groter is.


    Heb je iets toe te voegen aan de uitleg? Geluid uit in de reacties. Wilt u meer antwoorden van andere technisch onderlegde Stack Exchange-gebruikers lezen? Bekijk hier de volledige discussiethread.