Jaki jest maksymalny stopień kompresji gzip?
Jaki jest największy rozmiar, do którego można zdekompresować plik gzip (powiedzmy 10kb dla przykładu)?
Jaki jest największy rozmiar, do którego można zdekompresować plik gzip (powiedzmy 10kb dla przykładu)?
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.
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.
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
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%.