Начална » как да » Защо Zip е в състояние да компресирате единични файлове по-добре от няколко файла със същото съдържание?

    Защо Zip е в състояние да компресирате единични файлове по-добре от няколко файла със същото съдържание?

    Възможно е да компресираме файловете си, така че да ги споделяме по-лесно и / или да ги транспортираме, да направим електронния ни живот много по-лесен, но понякога можем да видим странни или неочаквани резултати за оразмеряване след компресирането им. Защо така? Днешната публикация за въпроси и отговори SuperUser има отговори на объркани въпроси на читателя.

    Днешната сесия за въпроси и отговори идва при нас с любезното съдействие на SuperUser - подразделение на Stack Exchange, групирано от общността уеб сайтове за въпроси и отговори.

    Снимката е предоставена от Jean-Etienne Minh-Duy Poirrier (Flickr).

    Въпроса

    Четецът на SuperUser sixtyfootersdude иска да знае защо zip може да компресира отделни файлове по-добре от няколко файла със същия тип съдържание:

    Да предположим, че имам 10 000 XML файла и искам да ги изпратя на приятел. Преди да ги изпратя, бих искал да ги компресирам.

    Метод 1: Не ги компресирайте

    Резултати:

    Метод 2: Запечатайте всеки файл отделно и му изпратете 10 000 компресирани XML файла

    Команда:

    Резултати:

    Метод 3: Създаване на единичен Zip файл, съдържащ всички 10 000 XML файла

    Команда:

    Резултати:

    Метод 4: Свързвате файловете в един файл и ги запечатвате

    Команда:

    Резултати:

    въпроси

    • Защо получавам такива драматично по-добри резултати, когато просто прекопирам един файл?
    • Очаквах да получа драстично по-добри резултати, използвайки метод 3, а не метод 2, но не го правя. Защо е това?
    • Това поведение е специфично за цип? Ако се опитах да използвам Gzip, ще получа ли различни резултати?

    Допълнителна информация

    Мета данни

    Един от дадените отговори предполага, че разликата е в метаданните на системата, които се съхраняват в zip файла. Не вярвам, че това може да бъде така. За да го тествам, направих следното:

    Полученият zip файл е 1,4 MB. Това означава, че все още има около 10 МБ необяснено пространство.

    Защо ципът може да компресира отделни файлове по-добре от няколко файла със същия тип съдържание?

    Отговорът

    Сътрудниците на SuperUser Alan Shutko и Aganju имат отговор за нас. Първо нагоре, Алан Шутко:

    Компресията на Zip се основава на повтарящи се модели в данните, които трябва да бъдат компресирани, а компресията става по-добра, ако файлът е по-дълъг, тъй като все повече и повече шаблони могат да бъдат намерени и използвани.

    Опростена, ако компресирате един файл, речникът, който преобразува (къси) кодове в (по-дълги) модели, задължително се съдържа във всеки производен zip файл; ако затворите един дълъг файл, речникът е „повторно използван“ и става още по-ефективен за цялото съдържание.

    Ако вашите файлове са дори малко по-сходни (както текстът винаги е), повторното използване на "речника" става много ефективно и резултатът е много по-малък общ zip файл.

    Следван от отговора от Aganju:

    В zip, всеки файл се компресира отделно. Обратното е твърдо компресиране, това означава, че файловете се компресират заедно. 7-zip и Rar използват твърдо компресиране по подразбиране. Gzip и Bzip2 не могат да компресират множество файлове, така че Tar се използва първо, имайки същия ефект като твърдото компресиране.

    Тъй като XML файловете имат подобна структура (и вероятно подобно съдържание), ако файловете се компресират заедно, компресията ще бъде по-висока.

    Например, ако файлът съдържа низ „И компресорът вече е намерил този низ в друг файл, той ще го замени с малък показалец към предишния мач. Ако компресорът не използва твърдо компресиране, първото появяване на низ във файла ще бъде записано като буквален, което е по-голямо.


    Имате ли какво да добавите към обяснението? Звучи в коментарите. Искате ли да прочетете повече отговори от други технологични потребители на Stack Exchange? Вижте пълната тема за дискусия тук.