Dlaczego Zip może kompresować pojedyncze pliki lepiej niż wiele plików o tej samej treści?
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, opartego na społecznościach grupowania witryn 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ę wysłać je do znajomego. 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 uzyskuję tak radykalnie lepsze wyniki, gdy tylko zapakowuję pojedynczy plik?
- Spodziewałem się drastycznie lepszych wyników przy użyciu metody 3 zamiast metody 2, ale nie. Dlaczego to?
- Czy to zachowanie jest specyficzne dla zip? Jeśli spróbuję użyć Gzip, otrzymam 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 treści?
Odpowiedź
Współautorzy SuperUser Alan Shutko i Aganju mają dla nas odpowiedź. Najpierw Alan Shutko:
Kompresja zip opiera się na powtarzających się wzorcach danych, które mają być skompresowane, a kompresja staje się lepsza, im dłuższy jest plik, ponieważ można znaleźć więcej i dłuższe wzory.
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 zapiszesz jeden długi plik, słownik zostanie "ponownie użyty" i będzie 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. Przeciwieństwem jest stała kompresja, oznacza to, że pliki są kompresowane razem. 7-zip i Rar domyślnie używają 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.