Możliwy duplikat:
Dlaczego kompresja ZIP nic nie kompresuje?
Próbowałem 7zipping pliku .exe, ale tak naprawdę stał się większy.
Czy to oczekiwany wynik?
Możliwy duplikat:
Dlaczego kompresja ZIP nic nie kompresuje?
Próbowałem 7zipping pliku .exe, ale tak naprawdę stał się większy.
Czy to oczekiwany wynik?
Odpowiedzi:
Sprowadza się do koncepcji zwanej entropią . Zobacz Wikipedia .
Podstawową ideą jest to, że jeśli istniała operacja kompresji, która zawsze może zmniejszać plik, logika mówi, że ta operacja kompresji byłaby w stanie zmniejszyć dowolny plik do 0 bajtów i nadal zachować wszystkie dane. Jest to jednak absurdalne , ponieważ wiemy, że 0 bajtów w ogóle nie może przekazać żadnej informacji. Właśnie dlatego udowodniliśmy, że nie może istnieć algorytm kompresji, który zawsze zmniejsza jego dane wejściowe, ponieważ w takim przypadku każda informacja mogłaby być przechowywana w 0 bajtach - ale 0 bajtów oznacza brak informacji, więc możesz ' jednocześnie nie mają informacji i wszystkich informacji. To jest absurdalne.
Ze względu na tę teoretyczną koncepcję, każdy program kompresji, którego kiedykolwiek użyjesz, zwiększy (lub w najlepszym razie utrzyma ten sam rozmiar) niektóre dane wejściowe. Oznacza to, że dla każdego zaprojektowanego lub używanego algorytmu kompresji będą pewne dane wejściowe, które wyjdą mniejsze, a niektóre nie.
Już skompresowane dane są ogólnie okropnym kandydatem do dalszej kompresji, ponieważ większość algorytmów kompresji bezstratnej opiera się na tych samych zasadach teoretycznych. Możliwe jest dalsze kompresowanie słabo skompresowanych danych; ale jest to mniej wydajne niż zwykłe kompresowanie go za pomocą najlepszego dostępnego algorytmu z oryginalnych danych na początek.
Na przykład, jeśli masz plik tekstowy 100 MB i kompresujesz go przy użyciu zwykłego algorytmu Zip, może zostać skompresowany do 50 MB. Jeśli następnie skompresujesz plik Zip za pomocą LZMA2, możesz go zmniejszyć do 40 lub 45 MB, ponieważ LZMA ma wyższy współczynnik kompresji dla większości danych podlegających kompresji niż Zip. Jest więc oczywiste, że może również kompresować dane Zip, ponieważ Zip nie wysysa z niego całej entropii. Ale jeśli całkowicie wyeliminujesz pojemnik Zip, możesz być w stanie go jeszcze zmniejszyć, kompresując surowy tekst za pomocą LZMA2, potencjalnie uzyskując coś rzędu 30 - 35 MB (są to tylko „liczby lotnicze” ilustrujące tę koncepcję) .
W przypadku tego pliku binarnego, który próbujesz skompresować, jest on większy, ponieważ format pliku 7-Zip musi stworzyć własną strukturę wewnętrzną i spakować już skompresowane dane pliku wykonywalnego do formatu 7-Zip. Zawiera rzeczy takie jak słownik, nagłówek pliku i tak dalej. Te dodatkowe dane są zwykle więcej niż kompensowane przez oszczędności związane z kompresowaniem samych danych, ale wydaje się, że plik wykonywalny, który próbujesz skompresować, jest już skompresowany za pomocą jakiejś formy LZMA; w przeciwnym razie prawdopodobnie zmniejszyłby rozmiar pliku wykonywalnego lub bardzo nieznacznie go zwiększył, zamiast zwiększać o 2 MB (co jest dużo).
2^(n+1)-1
komunikaty o rozmiarze n-bitów lub mniejszym. Nasz algorytm musi odwzorować każdy z nich na unikalne wyjście. Jeśli nawet jedna z nich zostanie zmapowana na wartość o mniejszej liczbie bitów, inna wartość musi koniecznie zostać odwzorowana na wartość o większej liczbie bitów.
Podstawowe algorytmy kompresji stosowane w 7z są bezstratne . Co oznacza, że możesz wielokrotnie iteracyjnie kompresować i dekompresować plik. Ponadto po każdej iteracji plik pozostanie dokładnie taki sam.
Niestety nie można oczekiwać wielokrotnego stosowania bezstratnego algorytmu kompresji z zawsze pozytywnym wynikiem. Istnieje ścisła granica, której nie może przeskoczyć. Z grubsza granica ta zależy od tego, jak ściśle sekwencja wejściowa gromadzi losowe dane. Przede wszystkim stosowane są bezstratne algorytmy do kompresji plików, przesyłania danych przez Internet HTML, kopii zapasowych i innych operacji, które oczekują dekompresji pliku wyjściowego na dokładnie ten sam oryginalny plik wejściowy.
W przeciwieństwie do kompresji bezstratnej , zawsze można oczekiwać zmniejszenia rozmiaru pliku po kompresji za pomocą algorytmów kompresji stratnej (lub stratnej) . Wadą jest to, że nie można dokładnie przywrócić oryginalnego pliku po pojedynczej iteracji kompres-dekompresja. Algorytmy te są najbardziej znane z transmisji i przechowywania audio / wideo / obrazu.
bzip2 , LZMA , LZMA2 i inne algorytmy używane w formacie 7z są bezstratne . Dlatego będzie limit, po którym nie będzie już mógł się kompresować. Ponadto obrazy wykonywalne (.exe) są zwykle plikami o wysokim stopniu kompresji. 7zip, podobnie jak wiele innych narzędzi do kompresji, osadza niektóre metadane, co w rzeczywistości może zwiększyć plik wyjściowy.
W takim przypadku zawsze zobaczysz, że skompresowany plik jest mniejszy niż plik wejściowy. Zobacz komentarz poniżej, dlaczego nie jest to możliwe.
Większość algorytmów kompresji wykorzystuje tak zwaną tablicę symboli, po prostu tylko fragmenty pliku, który wykorzystuje jako elementy, które MOŻE skompresować. To oczywiście stwarza pewne obciążenie w pliku, ale zwykle powoduje znacznie mniejszy plik.
W już skompresowanych plikach nadal tworzy zestaw symboli, ale jest bardzo niewiele, aby można było zmniejszyć rozmiar. W twoim przypadku tablica symboli już skompresowanego pliku jest prawdopodobnie w okolicach 2 MB lub więcej, jeśli udało się go trochę skompresować.