2010-05-09 11:47:14 +0000 2010-05-09 11:47:14 +0000
53
53

Jaki jest maksymalny stopień kompresji gzip?

Jaki jest największy rozmiar, do którego można zdekompresować plik gzip (powiedzmy 10kb dla przykładu)?

Odpowiedzi (7)

95
95
95
2010-05-09 13:11:52 +0000

Uaktualnienie 2020-02-06: Jak wspomniano w komentarzach, nie udało mi się odtworzyć oryginalnego wyniku z gzipem. Pracując nad założeniem, że przypadkowo użyłem innego formatu kompresji w tym oryginalnym szybkim teście, powtórzyłem z gzip i odpowiednio zaktualizowałem liczby poniżej. Ten nowy wynik zgadza się z teoretyczną maksymalną kompresją podaną w innych odpowiedziach / komentarzach.


To bardzo zależy od danych, które są kompresowane. Szybki test z plikiem 1Gb pełnym zer przy użyciu standardowej wersji gzip (z domyślnymi opcjami lub podając -9) daje skompresowany rozmiar ~ 1018Kb, więc twój plik 10Kb może potencjalnie rozszerzyć się do ~ 10Mb.

Jeśli dane mają niską redundancję na początku, na przykład archiwum zawiera pliki graficzne w formacie, który jest skompresowany natywnie (gif, jpg, png, …), wtedy gzip może w ogóle nie dodawać dalszej kompresji. Dla plików binarnych, takich jak pliki wykonywalne programów, można zobaczyć do 2:1 kompresji, dla zwykłego tekstu, HTML lub innych znaczników 3:1 lub 4:1 lub więcej nie jest mało prawdopodobne. Możesz zobaczyć 10:1 w niektórych przypadkach, ale ~1030:1 widziane z plikiem wypełnionym pojedynczym symbolem jest czymś, czego nie zobaczysz poza podobnie sztucznymi okolicznościami.

Możesz sprawdzić ile danych uzyskasz 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 zapisze wyników, zamiast tego przekazując je do wc, który policzy liczbę bajtów w trakcie ich przekazywania, a następnie je odrzuci. Jeśli skompresowana zawartość jest plikiem tar zawierającym wiele małych plików, może się okazać, że do rozpakowania całego archiwum potrzeba znacznie więcej miejsca na dysku, ale w większości przypadków liczba bajtów zwrócona przez gunzip będzie tak dokładna, jak potrzebujesz.

10
10
10
2010-05-09 12:04:29 +0000

Zazwyczaj nie uzyskuje się więcej niż 95% kompresji (więc 10kB danych w gzipie zdekompresuje się do ~200kB), ale są specjalnie spreparowane pliki, które rozszerzają się wykładniczo. Poszukaj 42.zip, dekompresuje się on do kilku petabajtów (bezsensownych) danych.

8
8
8
2017-05-11 14:16:39 +0000

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

Maksymalny stopień kompresji formatu deflate wynosi 1032:1. Dzieje się tak, ponieważ najdłuższy odcinek, który może być zakodowany to 258 bajtów. Do każdego takiego przebiegu potrzebne są co najmniej dwa bity (jeden bit dla kodu długości i jeden bit dla kodu odległości), stąd na jeden skompresowany bajt można zakodować 4 bity = 1032 nieskompresowane bajty.

Możesz uzyskać większą kompresję przez gzipowanie wyniku działania gzip. Normalnie nie poprawia to kompresji, ale dla bardzo długich przebiegów może.

Przy okazji, podejście LZ77 używane przez deflate jest bardziej ogólne niż kodowanie długości przebiegu. Zamiast zwykłej długości, używana jest para długość/odległość. Pozwala to na kopiowanie łańcucha z pewnej odległości wstecz, lub replikowanie bajtu jak w run-length dla odległości jednego, lub replikowanie trójek bajtów z odległością trzech, itd.

6
6
6
2010-05-09 12:03:51 +0000

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

Tutaj jest analiza na MaximumCompression , Spójrz na jedną z próbek jak, Podsumowanie testów porównawczych kompresji wielu plików

File type : Multiple file types (46 in total) # of files to compress in this test : 510 Total File Size (bytes) : 316.355.757 Average File Size (bytes) : 620,305 Largest File (bytes) : 18,403,071 Smallest File (bytes) : 3,554
4
4
4
2010-05-09 12:44:19 +0000

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

4
4
4
2013-04-07 13:12:41 +0000

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

1
1
1
2016-10-17 02:32:42 +0000

Odpowiedź na twoje pytanie, zależy od danych wejściowych. Aby dać ci pojęcie, jak kompresja jest wykonywana, obejrzyj ten sześciominutowy filmik. https://www.youtube.com/watch?v=ZdooBTdW5bM

To co powinieneś z niego wyciągnąć to fakt, że stopień kompresji zależy od częstotliwości występowania każdego znaku, więc nie ma generel max rate, zależy to od danych wejściowych, dla angielskiego tekstu jest to około 65%.