If-Koubou

Dlaczego Zip może kompresować pojedyncze pliki lepiej niż wiele plików o tej samej treści?

Dlaczego Zip może kompresować pojedyncze pliki lepiej niż wiele plików o tej samej treści? (Jak)

Możliwość kompresowania plików, dzięki czemu łatwiej je udostępniać i / lub przenosić, może znacznie uprościć nasze życie elektroniczne, ale czasami możemy zauważyć dziwne lub nieoczekiwane wyniki wymiarowania po ich skompresowaniu. Dlaczego? Dzisiejszy post z pytaniami i odpowiedziami dla SuperUser zawiera odpowiedzi na zagubione pytania czytelnika.

Dzisiejsza sesja pytań i odpowiedzi przychodzi do nas dzięki uprzejmości SuperUser - poddziału Stack Exchange, społecznościowego forum z pytaniami i odpowiedziami.

Zdjęcie dzięki uprzejmości Jean-Etienne Minh-Duy Poirrier (Flickr).

Pytanie

Czytnik SuperUser sixtyfootersdude chce wiedzieć, dlaczego zip jest w stanie skompresować pojedyncze pliki lepiej niż wiele plików o tym samym typie treści:

Załóżmy, że mam 10 000 plików XML i chcę je wysłać znajomemu. Przed ich wysłaniem chciałbym je skompresować.

Metoda 1: Nie kompresuj ich

Wyniki:

Metoda 2: Rozpakuj każdy plik oddzielnie i wyślij 10 000 spakowanych plików XML

Dowództwo:

Wyniki:

Metoda 3: Utwórz pojedynczy plik zip zawierający wszystkie 10.000 plików XML

Dowództwo:

Wyniki:

Metoda 4: Połącz pliki w jeden plik i rozpakuj go

Dowództwo:

Wyniki:

pytania

  • Dlaczego otrzymuję tak radykalnie lepsze wyniki, gdy tylko zapakowuję pojedynczy plik?
  • Spodziewałem się drastycznie lepszych wyników przy użyciu metody 3, a nie metody 2, ale nie. Dlaczego to?
  • Czy to zachowanie jest specyficzne dla zip? Gdybym spróbował użyć Gzip, czy uzyskałbym inne wyniki?

Dodatkowe informacje

Dane meta

Jedna z podanych odpowiedzi sugeruje, że różnica polega na meta danych systemowych przechowywanych w pliku zip. Nie wierzę, że tak może być. Aby przetestować, wykonałem następujące czynności:

Wynikowy plik ZIP to 1,4 MB. Oznacza to, że wciąż pozostaje około 10 MB niewyjaśnionej przestrzeni.

Dlaczego zip potrafi kompresować pojedyncze pliki lepiej niż wiele plików o tym samym typie zawartości?

Odpowiedź

Współautorzy SuperUser Alan Shutko i Aganju mają dla nas odpowiedź. Najpierw Alan Shutko:

Kompresja zip jest oparta na powtarzających się wzorcach w danych, które mają być skompresowane, a kompresja staje się lepsza, im dłuższy jest plik, ponieważ można znaleźć i użyć więcej i dłuższych wzorów.

Uproszczone, jeśli kompresujesz jeden plik, słownik, który mapuje (krótkie) kody do (dłuższych) wzorców, jest koniecznie zawarty w każdym wynikowym pliku zip; jeśli skompresujesz jeden długi plik, słownik jest "ponownie wykorzystywany" i staje się jeszcze skuteczniejszy we wszystkich treściach.

Jeśli twoje pliki są nawet trochę podobne (tak jak zawsze tekst), ponowne użycie "słownika" staje się bardzo wydajne, a wynikiem jest znacznie mniejszy całkowity plik zip.

Poniżej znajduje się odpowiedź od Aganju:

W pliku ZIP każdy plik jest kompresowany osobno. Przeciwnie stała kompresjaoznacza to, że pliki są kompresowane razem. 7-zip i Rar używają domyślnie stałej kompresji. Gzip i Bzip2 nie mogą kompresować wielu plików, więc najpierw używa się Tar, mając taki sam efekt jak kompresja.

Ponieważ pliki XML mają podobną strukturę (i prawdopodobnie podobną zawartość), jeśli pliki są skompresowane razem, kompresja będzie większa.

Na przykład, jeśli plik zawiera ciąg ""I kompresor znalazł już ten ciąg w innym pliku, zastąpi go małym wskaźnikiem do poprzedniego dopasowania. Jeśli kompresor nie stosuje kompresji stałej, pierwsze wystąpienie ciągu w pliku zostanie zapisane jako dosłowny, który jest większy.

Czy masz coś do dodania do wyjaśnienia? Dźwięk w komentarzach. Chcesz przeczytać więcej odpowiedzi od innych użytkowników Stack Exchange, którzy znają się na technologii? Sprawdź cały wątek dyskusji tutaj.