Czy tarowanie wielu plików razem może poprawić kompresję za pomocą standardowych narzędzi, np. Gzip, bzip2, xz?
Od dawna myślałem, że tak jest, ale nigdy tego nie testowałem. Jeśli mamy 2 kopie tego samego pliku o wielkości 20 MB losowych bajtów tar, razem, sprytny program do kompresji, który zdaje sobie sprawę, że może skompresować cały plik tarball do prawie 20 MB.
Właśnie próbowałem tego eksperymentu przy użyciu gzip, bzip2 i xz do kompresji 1) pliku losowych bajtów, 2) tarballa dwóch kopii tego pliku i 3) kota dwóch kopii tego pliku. We wszystkich przypadkach kompresja nie zmniejszała rozmiaru pliku. Jest to oczekiwane w przypadku 1, ale w przypadkach 2 i 3 optymalnym rezultatem jest to, że plik 40 Mb może zostać zmniejszony do prawie 20 Mb. To trudny wgląd w program kompresji, szczególnie dlatego, że redundancja jest daleka, więc nie spodziewałbym się idealnego rezultatu, ale nadal myślałem, że będzie kompresja.
Test:
dd if=/dev/urandom of=random1.txt bs=1M count=20
cp random1.txt random2.txt
cat random1.txt random2.txt > random_cat.txt
tar -cf randoms.tar random1.txt random2.txt
gzip -k random* &
bzip2 -k random* &
xz -k random* &
wait
du -sh random*
Wynik:
20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 1.40937 s, 14.9 MB/s
[1] Done gzip -k random*
[2]- Done bzip2 -k random*
[3]+ Done xz -k random*
20M random1.txt
21M random1.txt.bz2
21M random1.txt.gz
21M random1.txt.xz
20M random2.txt
21M random2.txt.bz2
21M random2.txt.gz
21M random2.txt.xz
40M random_cat.txt
41M random_cat.txt.bz2
41M random_cat.txt.gz
41M random_cat.txt.xz
41M randoms.tar
41M randoms.tar.bz2
41M randoms.tar.gz
41M randoms.tar.xz
Czy to jest ogólnie to, czego powinienem się spodziewać?
Czy istnieje sposób na poprawę kompresji?
źródło
Odpowiedzi:
Jesteś przeciwny „rozmiarowi bloku” sprężarki. Większość programów do kompresji dzieli dane wejściowe na bloki i kompresuje każdy blok. Wygląda na to, że rozmiar bloku bzip wzrasta tylko do 900 KB, więc nie zobaczy żadnego wzorca, który powtórzy się dłużej niż 900 KB.
http://www.bzip.org/1.0.3/html/memory-management.html
gzip wydaje się używać bloków 32K.
Z XZ masz jednak szczęście! Ze strony podręcznika:
więc „xz -8” znajdzie do 32 MB wzorców, a „xz -9” do 64 MB wzorców. Ale uwaga, ile pamięci RAM wymaga kompresji (i dekompresji) ...
źródło
Losowe zawartości pliku wybrałeś nie jest dobrym przykładem - sprasowane archiwów tar będzie większy niż oryginały. To samo zobaczysz w przypadku plików w już kompresowanych formatach (na przykład wiele formatów obrazu / audio / wideo).
Ale łączenie wielu plików ze ściśliwą zawartością zwykle powoduje mniejszy całkowity rozmiar pliku tar niż w przypadku oddzielnego tarowania, zwłaszcza gdy zawartość jest podobna (na przykład pliki logów z tego samego programu). Powodem jest to, że niektóre dane przesunięcia kompresji dla poszczególnych plików (takie jak tablice wzorców dla niektórych algorytmów kompresji) mogą być współużytkowane przez wszystkie pliki w tym samym pliku tar.
źródło
Jak już wspomniano:
Lepszym przypadkiem testowym może być:
(Uwaga: Mam nadzieję, że pod nią nie ma wierzchowców
/usr
!)Zamiast tego możesz użyć
tar -jcf
kompresji xz.Teraz, jeśli
test2.tar.gz
jest mniejszy niż test1.tar.gz, to test się powiedzie (tzn. Tarowanie plików, a następnie kompresowanie jest lepsze niż kompresowanie niż tarowanie). Sądzę, że tak będzie w przypadku wielu (tj. Tysięcy) plików. Minusem jest to, że wykonanie go może potrwać dłużej, a także wymaga dużo więcej miejsca na dysku, ponieważ najpierw musi skompilować cały plik tar, a następnie go skompresować. Dlatego zamiast tego często używana jest pierwsza metoda, ponieważ kompresuje ona każdy plik w locie, nawet jeśli nie daje tak małego tarballa.Na przykład w naszej zewnętrznej kopii zapasowej zwykle tworzymy kopię zapasową 4 000 000 plików o łącznej wielkości około 2 TB. Tak więc pierwsza metoda jest znacznie szybsza i nie wymaga dodatkowych 2 TB dysku.
źródło
-z
kompresuje archiwum (tj. Tar)? Zazwyczaj nazwa pliku wyjściowego zczf
końcówką .tar.gz to podkreśla.