If-Koubou

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

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

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

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

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

Въпроса

Супервайзър четец шестия шеф иска да знае защо zip е в състояние да компресирате отделни файлове по-добре от множество файлове със същия тип съдържание:

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

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

Резултати:

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

Команда:

Резултати:

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

Команда:

Резултати:

Метод 4: Свържете файловете в един файл и го компресирайте

Команда:

Резултати:

въпроси

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

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

Мета данни

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

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

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

Отговорът

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

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

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

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

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

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

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

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

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