Opierając się na pomyśle, że spakowany plik jest nowym plikiem binarnym, dlaczego nie mogę zmniejszyć rozmiaru Zipa przez spakowanie go raz za razem - aż do bardzo małego pliku wynikowego?
zip
binary-files
Diogo
źródło
źródło
Odpowiedzi:
Ponieważ kompresja działa na podstawie wyszukiwania wzorców i zmniejszania podobnych danych.
Na przykład RLE (Run-length Encoding) to prosta metoda kompresji, w której dane są badane, a przebiegi podobnych danych są kompresowane w następujący sposób:
Jak widać, zastępując powtarzane dane tylko danymi i liczbą ich wystąpienia, można zmniejszyć ten konkretny przykład z 35 bajtów do 20 bajtów. To nie jest duża redukcja, ale wciąż jest o 42% mniejsza. Co więcej, jest to mały, wymyślony przykład; większe, rzeczywiste przykłady mogłyby mieć jeszcze lepszą kompresję. (
OO
Został sam, ponieważ zastąpienie go2O
nie uratuje niczego.)Pliki tekstowe często kompresują się naprawdę dobrze, ponieważ mają wiele wzorów, które można skompresować. Na przykład słowo to jest bardzo popularne w języku angielskim, więc można usunąć każde wystąpienie tego słowa z identyfikatorem, który jest tylko jednym bajtem (lub nawet mniej). Można również skompresować więcej z części słów, które są podobne jak
cAKE
,bAKE
,shAKE
,undertAKE
, i tak dalej.Dlaczego więc nie możesz skompresować pliku, który już został skompresowany? Ponieważ podczas wstępnej kompresji usunięto wzorce .
Spójrz na skompresowany przykład RLE. Jak możesz to jeszcze bardziej skompresować? Nie ma serii identycznych danych do kompresji. W rzeczywistości często, gdy próbujesz skompresować plik, który jest już skompresowany, możesz skończyć z większym plikiem. Na przykład, jeśli zmusiłeś powyższy przykład do ponownego zakodowania, możesz otrzymać coś takiego:
Teraz dane kompresji (liczby uruchomień) same są traktowane jak dane, więc otrzymujesz większy plik niż początkowo.
Co mogłoby spróbować jest użycie innego algorytmu kompresji, ponieważ możliwe jest, że wyjście jednego algorytmu kompresji mogłaby być podstawowym dla innego algorytmu, jednak jest to zwykle dość mało prawdopodobne.
Oczywiście chodzi tu o kompresję bezstratną, w której zdekompresowane dane muszą być dokładnie identyczne z danymi oryginalnymi. Z kompresji stratnej , zazwyczaj można usunąć więcej danych, ale jakość idzie w dół. Ponadto kompresja stratna zwykle używa pewnego rodzaju schematu opartego na wzorcach (nie tylko odrzuca dane), więc w końcu osiągniesz punkt, w którym po prostu nie ma wzorców do znalezienia.
źródło
Jeśli wszystkie skompresowane pliki po ponownej kompresji zmniejszą swoje rozmiary (lub mają rozmiary nie większe niż ich rodzic), to w pewnym momencie rozmiar wyniesie 0, co nie może być prawdą. Jeśli to prawda, prawie wcale nie potrzebujemy przechowywania plików.
https://en.wikipedia.org/wiki/Lossless_compression#Limitations
źródło
Plik, który został optymalnie skompresowany, nie będzie zawierał żadnych wzorców ani niczego, co można by zmniejszyć.
Wyobraźmy sobie prosty plik, który to zawiera.
Jeśli go skompresujemy, możemy powiedzieć, że jest to 20 A, nowa linia, a następnie 20 B, nowa linia, a następnie 20 C. Lub coś w tym rodzaju
20xA\n20xB\n20xC\n
. Po wykonaniu pierwszej kompresji nie ma nowych wzorów do kompresji. W każdym razie, jeśli informacja jest unikalna.źródło
Powiedziałbym, że nie można w dużym stopniu kompresować dowolnych plików binarnych - pomyśl o obrazach JPEG, filmach x264 itd. Zwłaszcza, że chcesz dokładnie odtworzyć oryginalny plik (tzn. Krok po kroku), potrzebujesz kompresji bezstratnej . 1
Przyczynę tej ograniczonej kompresji podano w tym artykule Wikipedii na temat Entropy, który określa oczekiwaną wartość informacji zawartych w komunikacie :
1 Bardzo silna „kompresja” obrazów JPEG jest możliwa tylko dlatego, że niektóre informacje są odrzucane (w taki sposób, że ludzkie oko nie może ich rozpoznać na pierwszy rzut oka; kompresja stratna ).
źródło
I'd say can't compress any binary file
To nieprawda, zwykle można dość mocno skompresować ekwipunki, stąd UPX .