Jaki jest maksymalny współczynnik kompresji gzip?

51

Jaki jest największy rozmiar, do którego można rozpakować gzip (na przykład 10 kb)?

Zombie
źródło

Odpowiedzi:

91

To bardzo zależy od kompresji danych. Szybki test z plikiem 1 Gb wypełnionym zerami daje skompresowany rozmiar ~ 120 KB, więc Twój plik 10 KB może potencjalnie rozwinąć się do ~ 85 MB.

Jeśli dane mają na początku małą nadmiarowość, na przykład archiwum zawiera pliki obrazów w formacie, który jest kompresowany natywnie (gif, jpg, png, ...), wówczas gzip może w ogóle nie dodawać dalszej kompresji. W przypadku plików binarnych, takich jak pliki wykonywalne programów, może wystąpić kompresja do 2: 1, w przypadku zwykłego tekstu, HTML lub innych znaczników 3: 1 lub 4: 1 lub więcej nie jest mało prawdopodobne. W niektórych przypadkach możesz zobaczyć 10: 1, ale ~ 8700: 1 widziany z plikiem wypełnionym pojedynczym symbolem jest czymś, czego nie zobaczysz poza podobnie sztucznymi okolicznościami.

Możesz sprawdzić, ile danych wynikałoby z rozpakowania pliku gzip, bez faktycznego zapisywania jego nieskompresowanej zawartości na dysk, za pomocą gunzip -c file.gz | wc --bytes- spowoduje to rozpakowanie pliku, ale nie zapisanie wyników, zamiast tego przekazanie ich do wcliczby policzonych bajtów następnie odrzuć je. Jeśli skompresowana zawartość jest plikiem tar zawierającym wiele wielu małych plików, może się okazać, że zauważalnie potrzeba więcej miejsca na dysku, aby rozpakować pełne archiwum, ale w większości przypadków liczba zwrócona z gunzipwyjścia wcpotokowego będzie tak dokładna, jak potrzebujesz.

David Spillett
źródło
Widziałem, jak HTML rozszerza się do 10x (oczywiście x3 i x4 były najczęstsze!) .... być może dużo zbędnych danych dla tych, które eksplodowały + 8x. Myślę, że ta strona, która to robiła, była stroną informacyjną php.
Zombie
Powtarzające się znaczniki, jak widać na wyjściu phpinfo(), kompresują się bardzo dobrze. Informacje techniczne zawarte w tych wynikach zawierają również więcej bezpośrednich powtórzeń niż średnia część języka naturalnego, a rozkład alfabetu jest prawdopodobnie mniej płynny, co może pomóc etapowi Huffmana uzyskać lepsze wyniki.
David Spillett
Ta odpowiedź nie uwzględnia celowo złośliwych skompresowanych danych. Można stworzyć złośliwy plik zip o wielkości około 10 KB, który można rozszerzyć do nieco ponad 4 GB.
David Schwartz
Bomby zip tej skali opierają się jednak na zagnieżdżonych archiwach, więc gdy człowiek rozpakowuje plik, wkrótce zauważysz coś dziwnego. Można je jednak wykorzystać jako skuteczny atak DoS na automatyczne skanery (na usługi pocztowe itp.).
David Spillett
1
@DavidSpillett: Zagnieżdżone bomby zip powiększają się do rozmiarów w zakresie petabajtów. Nie o tym mówię. Spójrz nawet na jedną warstwę typowej zamka błyskawicznego.
David Schwartz
10

Zwykle nie uzyskuje się kompresji większej niż 95% (tak, że spakowane dane 10kB rozpakują się do ~ 200kB), ale istnieją specjalnie spreparowane pliki, które rozwijają się wykładniczo. Poszukaj 42.zip, dekompresuje się do kilku petabajtów (bez znaczenia) danych.

liori
źródło
4
Wikipedia twierdzi, że 42.zip „zawiera pięć warstw zagnieżdżonych plików zip w zestawach po 16”, więc nie jest to prawidłowy przykład dekompresji (tylko dekompresji rekurencyjnej).
Tgr
5
Rzeczywiście 42.zip stanowi szczególne zagrożenie dla narzędzi automatycznie skanujących pliki zip rekurencyjnie, na przykład skanerów antywirusowych.
thomasrutter
4
To jest zip, a nie gzip
BeniBela
8

Cytowany dosłownie z https://stackoverflow.com/a/16794960/293815

Maksymalny współczynnik kompresji formatu deflate wynosi 1032: 1. Wynika to z faktu, że najdłuższy przebieg, który można zakodować, to 258 bajtów. Wymagane są co najmniej dwa bity dla każdego takiego przebiegu (jeden bit dla kodu długości i jeden bit dla kodu odległości), dlatego 4 * 258 = 1032 nieskompresowanych bajtów można zakodować na jeden skompresowany bajt.

Możesz uzyskać większą kompresję, gzipując wynik gzip. Zwykle nie poprawia to kompresji, ale w przypadku bardzo długich serii może.

Nawiasem mówiąc, podejście LZ77 stosowane przez deflację jest bardziej ogólne niż kodowanie długości przebiegu. Zamiast samej długości używana jest para długość / odległość. Pozwala to na kopiowanie łańcucha z pewnej odległości wstecz lub replikację bajtu w długości przebiegu dla odległości jednego, lub replikację trzech bajtów z odległością trzech itd.

ioquatix
źródło
6

Współczynnik kompresji dowolnego algorytmu kompresji będzie funkcją kompresowanych danych (oprócz długości tych danych).

Oto analiza w MaximumCompression ,
spojrzeć na jednej z próbek takich jak,

Podsumowanie testów porównawczych wielu kompresji plików

Typ pliku: wiele typów plików (łącznie 46)  
Liczba plików do kompresji w tym teście: 510  
Całkowity rozmiar pliku (bajty): 316.355.757 
Średni rozmiar pliku (bajty): 620 305
Największy plik (bajty): 18 403 071
Najmniejszy plik (bajty): 3,554
nik
źródło
4

Ogromny plik zawierający tylko jeden symbol bardzo dobrze się kompresuje.

maniak
źródło
4

10 MB zer w pliku, skompresuj gzip -9 do 10217. Tak więc maksymalny współczynnik wygląda na około 1000x.

nikos
źródło
1

Odpowiedź na twoje pytanie zależy od danych wejściowych. Aby dać Ci wyobrażenie o sposobie kompresji, obejrzyj te sześć minut filmów.

https://www.youtube.com/watch?v=ZdooBTdW5bM

Powinieneś z tego uzyskać, że stopień kompresji zależy od częstotliwości każdego znaku, więc nie ma maksymalnej szybkości generel, zależy od danych wejściowych, dla tekstu angielskiego wynosi około 65 procent.

brunsgaard
źródło
1
Witamy w Super User! Podaj zasadnicze części odpowiedzi z linku (linków) referencyjnych, ponieważ odpowiedź może stać się nieważna w przypadku zmiany połączonych stron.
DavidPostill
Bardziej trafne byłoby powiedzenie „częstotliwość każdego ciągu” niż „częstotliwość każdego znaku”
JoelFan