Jaka jest różnica między różnymi systemami „kompresji”?

9

Zawsze używałem TAR i ZIP do kompresji, ale ostatnio słyszałem o *.Zalgorytmie kompresji. To wywołało pytanie:

Który z tych wszystkich systemów kompresji jest najlepszy do ogólnego zastosowania i kompresji?

Przeprowadzając kilka testów, odkryłem, że tartak jak odkryłem, tak naprawdę NIE kompresuje się (chyba że jest to wyraźnie określone). Oznacza to, do czego służy w porównaniu z innymi metodami kompresji?

Jestem świadom, że już pocztowy jest najczęściej używanym systemem kompresji, ale należy go używać zamiast *.Z, *.7z, .tar, lub .tar.<insert ending here>?

Podsumowanie postu:

  1. Powinno się używać *.tar, *.Z, *.7z, .tar, lub .tar.<insert ending here>za najlepszą kompresję?
  2. Jeśli zwykły *.tarnie kompresuje, dlaczego go używamy?

EDYCJA: Nie wszystkie algorytmy pozwalają na przechowywanie uprawnień do Linuksa (z tego, czego się nauczyłem). Co zrobić i czy istnieje jakiś hack (lub skrypt), którego mógłbym użyć do przechowywania uprawnień?

Kaz Wolfe
źródło
Nie trzeba tego mówić, po prostu wybierz najlepiej głosowany lub najbardziej pomocny :)
Seth

Odpowiedzi:

17

taroznacza archiwum taśm. Wszystko, co robi, to paczka plików i ich metadane (uprawnienia, własność itp.) W strumieniu bajtów, które mogą być przechowywane na napędzie taśmowym (lub pliku) i przywracane później. Kompresja jest całkowicie odrębną kwestią, którą kiedyś trzeba było przesyłać strumieniowo przez zewnętrzny program narzędziowy, aby kompresować w razie potrzeby. GNU tar był na tyle miły, że mógł dodać przełączniki, aby automatycznie filtrować dane wyjściowe przez odpowiednie narzędzie jako skrót.

Zip i 7z łączą ze sobą archiwizację i kompresję w swój własny format kontenera i mają na celu spakowanie plików w systemie DOS / Windows, więc nie przechowują uprawnień i własności Unixa. Dlatego jeśli chcesz przechowywać uprawnienia do prawidłowego tworzenia kopii zapasowych, musisz trzymać się tar. Jeśli planujesz wymianę plików z użytkownikami systemu Windows, zip lub 7z jest dobry. Faktyczne użycie algorytmów kompresji zip i 7zip może być używane z tar, odpowiednio przez uzing gzipi lzma.

lzma (aka. * .xz) ma jeden z najlepszych współczynników kompresji i jest dość szybki przy dekompresji, co czyni go obecnie najlepszym wyborem. Wymaga to jednak dużej ilości pamięci RAM i procesora. Czcigodny gzipjest nieco szybszy przy kompresji, więc można go użyć, jeśli nie chcesz poświęcać tyle czasu procesora. Ma także jeszcze szybszy wariant o nazwie lzop. bzip2jest nadal dość popularny, ponieważ w dużej mierze zastąpił gzip na jakiś czas przed pojawieniem się 7zip / lzma, ponieważ uzyskał lepsze współczynniki kompresji, ale obecnie traci na popularności, ponieważ 7z / lzma jest szybszy przy dekompresji i uzyskuje lepsze współczynniki kompresji. compressNarzędzie, które zazwyczaj w nazwach plików * .Z, jest stara i dawno zapomniane.

Jedną z innych ważnych różnic między zip i tar jest to, że zip kompresuje dane w małych porcjach, podczas gdy kompresując plik tar, kompresujesz wszystko naraz. Ten ostatni daje lepsze współczynniki kompresji, ale aby wyodrębnić pojedynczy plik na końcu archiwum, musisz zdekompresować całą rzecz, aby się do niego dostać. Dlatego format zip lepiej wydobywa pojedynczy plik lub dwa z dużego archiwum. 7z i darpozwala ci wybrać kompresję całości (zwanej trybem „stałym”) lub małych kawałków, aby ułatwić ekstrakcję fragmentaryczną.

psusi
źródło
Ale tylko TAR obsługuje metadane? Czy też gzip / bzip2 obsługuje teraz także metadane
Kaz Wolfe
@pacificfils, narzędzia do kompresji kompresują tylko jeden plik, bez metadanych.
psusi
czy można jednak skasować folder, a następnie umieścić go w zipie i zachować uprawnienia?
Kaz Wolfe
@pacificfils, tak, ale byłoby to trochę głupie, ponieważ rezygnowałbyś z zalet zip i lepszego współczynnika kompresji gzip.
psusi
@pacificfils tar cfpzachowa uprawnienia. Plik tar jest nieskompresowany, więc zip (7-zip), gzip2, gzip, lzo itp. Wszystko dobrze skompresują plik tar (ogólnie, tar skompresowanych plików raczej nie będzie podlegał kompresji).
Elliott Frisch
9

Szczegóły algorytmów są tutaj nie na temat 1, ponieważ nie są one w żaden sposób specyficzne dla Linuksa, nie mówiąc już o Ubuntu. Będzie jednak znaleźć kilka ciekawych informacji tutaj .

Teraz tar, jak powiedziałeś, tarnie jest i nigdy nie był programem do kompresji. Zamiast tego jest to archiwizator ; jego głównym celem jest utworzenie jednego dużego pliku z wielu małych. Historycznie miało to ułatwić przechowywanie na napędach taśmowych, stąd nazwa: Tape ARchive.

Dzisiaj głównym powodem do użycia tarjest zmniejszenie liczby plików w systemie. Każdy plik w systemie plików Unix zajmuje i- węzeł , im więcej plików masz, tym mniej dostępnych i-węzłów, a kiedy zabraknie i-węzłów, nie możesz już tworzyć nowych plików. Mówiąc prościej, ta sama ilość danych przechowywanych jak tysiące plików zajmie więcej twojego dysku twardego niż te same pliki w jednym archiwum tar.

Aby to zilustrować, ponieważ zostało to zakwestionowane w komentarzach, na mojej /partycji 68G mam następującą liczbę wszystkich i użytych i-węzłów (pamiętaj, że liczba i-węzłów zależy od typu systemu plików i wielkości partycji):

Inode count:              393216
Free inodes:              171421

Jeśli teraz spróbuję utworzyć więcej plików niż mam i-węzły:

$ touch {1..171422}
touch: cannot touch ‘171388’: No space left on device
touch: cannot touch ‘171389’: No space left on device
touch: cannot touch ‘171390’: No space left on device
touch: cannot touch ‘171391’: No space left on device
touch: cannot touch ‘171392’: No space left on device
touch: cannot touch ‘171393’: No space left on device
touch: cannot touch ‘171394’: No space left on device
touch: cannot touch ‘171395’: No space left on device
touch: cannot touch ‘171396’: No space left on device
touch: cannot touch ‘171397’: No space left on device

Nie ma miejsca? Ale mam dużo miejsca:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       5,8G  4,3G  1,2G  79% /

Jak widać powyżej, utworzenie kilkuset tysięcy pustych plików szybko wyczerpuje moje i-węzły i nie mogę już tworzyć nowych. Gdybym to tarzrobił, mógłbym ponownie zacząć tworzyć pliki.

Mniejsza liczba plików znacznie przyspiesza operacje wejścia / wyjścia systemu plików, szczególnie w systemach plików zamontowanych przez NFS. Zawsze kończę tworzenie starych katalogów roboczych po zakończeniu projektu, ponieważ im mniej plików mam, tym szybsze programy findbędą działać.

Istnieje świetna odpowiedź na temat superużytkownika, która zawiera znacznie więcej szczegółów, ale oprócz powyższych, inne podstawowe powody, dla których tarwciąż jest dziś popularna, to:

  1. Wydajność: używanie tardo przepuszczania przez podobny program kompresji gzipjest bardziej wydajne, ponieważ pozwala uniknąć tworzenia plików pośrednich.

  2. tar jest wyposażony w różnego rodzaju dzwonki i gwizdki, funkcje, które zostały zaprojektowane w swojej długiej historii, dzięki czemu jest szczególnie przydatny do tworzenia kopii zapasowych * nix (uprawnienia do myślenia, własność pliku, możliwość przesyłania danych bezpośrednio do STDOUT i za pośrednictwem łącza SSH ... )

  3. Bezwładność. Jesteśmy przyzwyczajeni tar. Można bezpiecznie założyć, że będzie on dostępny na każdym * nixie, który może się zdarzyć, co czyni go bardzo przenośnym i przydatnym do archiwizacji kodu źródłowego.


1 Jest to absolutnie prawda i nie ma nic wspólnego z faktem, że nie wiem o nich wystarczająco dużo, aby wyjaśnić :)

terdon
źródło
3
Mój komputer miał (w przeszłości) ponad 10 000 000 plików, co nie jest zbyt szalone. Nigdy nie używam tardo „zmniejszania liczby plików”, ponieważ szczerze mówiąc, większość systemów plików nie przejmuje się tym, i tak naprawdę nie jest to optymalne, ponieważ tarnie obsługuje łatwego losowego dostępu do plików. Raczej głównym zastosowaniem (dla mnie i myślę, że dla większości ludzi) jest udostępnianie plików (np. Kodu źródłowego) innym osobom w prosty sposób.
nneonneo
@nneonneo, czy kiedykolwiek musiałeś pracować z milionami plików w jednym katalogu? Mam i wierzcie mi, że to nie jest łatwe. Pomijając oczywiste problemy ARG_MAX, może to utrudniać radzenie sobie z plikami i powodować (źle) skonfigurowaną sieć, w której pliki są przechowywane na centralnym serwerze i udostępniane NFS na kolana. Jeśli chodzi o zmniejszenie ogólnej liczby plików, potrzebujesz znacznie więcej plików, aby to zauważyć, ale w konfiguracjach z wieloma użytkownikami liczba i-węzłów może rzeczywiście stać się ograniczona.
terdon
@nneonneo, aby podać bardziej konkretny przykład, tune2fs -lna partycji trzymającej mój $ HOME mówi mi, że mam 19 300 352 i-węzłów. Nie będę w stanie utworzyć więcej plików niż to. Jak powiedziałeś, 10 ^ 6 nie jest szalone, nawet w wyższych zakresach. W zależności od tego, co robisz, możesz potrzebować znacznie więcej.
terdon
@nneonneo zobacz zaktualizowaną odpowiedź na prawdziwy przykład tego, jak łatwo zabraknąć i-węzłów.
terdon
Mój serwer używa nieco ponad miliona i-węzłów, a to tylko dlatego, że mam tonę wiadomości e-mail (wiele list mailingowych o dużym ruchu wraca od lat) i przechowuję je w formacie Maildir. Nie mam pojęcia, co możesz zrobić, aby użyć do 19 milionów i-węzłów. Będziesz musiał utworzyć nowy plik co sekundę, 24 godziny na dobę, przez ponad 7 miesięcy.
psusi
4

Istnieją dwa odrębne, ale powiązane zadania. Pakowanie drzewa plików (w tym nazw plików, struktury katalogów, uprawnień systemu plików, własności i wszelkich innych metadanych) do strumienia bajtów nazywa się archiwizacją . Usunięcie nadmiarowości w strumieniu bajtów w celu wytworzenia mniejszego strumienia bajtów nazywa się kompresją .

W systemie Unix dwie operacje są oddzielone, z osobnymi narzędziami dla każdej z nich. Na większości innych platform (bieżących i historycznych) połączone narzędzia wykonują zarówno archiwizację, jak i kompresję.

(gzip i inne programy naśladujące interfejs gzip często mają opcję przechowywania oryginalnej nazwy pliku w skompresowanym wyjściu, ale to, wraz z CRC lub innym sprawdzeniem wykrywającym uszkodzenie, jest jedynymi metadanymi, które mogą przechowywać).

Zalety oddzielania kompresji od archiwizacji. Archiwizacja jest specyficzna dla platformy (metadane systemu plików wymagające zachowania są bardzo zróżnicowane), ale implementacja jest prosta, w dużej mierze związana z operacjami we / wy i zmienia się niewiele w czasie. Kompresja jest niezależna od platformy, ale implementacje są związane z procesorem, a algorytmy stale się poprawiają, aby wykorzystać zwiększone zasoby, które współczesny sprzęt może wnieść do rozwiązania tego problemu.

Najpopularniejszym archiwizatorem uniksowym jest tar, choć istnieją inne, takie jak cpioi ar. (Pakiety Debiana są ararchiwami, podczas gdy cpiosą często używane do początkowych ramdysków.) tarJest lub było często łączone z narzędziami do kompresji, takimi jak compress(.Z), gzip(.gz), bzip2(.bz2) i xz(.xz), od najstarszych do najmłodszych , i nieprzypadkowo od najgorszej do najlepszej kompresji.

Tworzenie tari kompresowanie archiwum to odrębne kroki: kompresor nie wie nic o tarformacie pliku. Oznacza to, że wyodrębnienie pojedynczego pliku ze skompresowanego tararchiwum wymaga dekompresji wszystkich poprzednich plików. Jest to często nazywane „solidnym” archiwum.

Podobnie, ponieważ tar jest formatem „strumieniowym” - wymaganym do tego, aby był użyteczny w potoku - nie ma globalnego indeksu w archiwum tar, a wyświetlenie zawartości archiwum tar jest tak samo kosztowne jak jego wyodrębnienie.

Natomiast Zip i RAR i 7-zip (najpopularniejsze archiwizatory na współczesnych platformach Windows) zwykle kompresują każdy plik osobno, a metadane kompresują lekko, jeśli w ogóle. Umożliwia to tanie wyświetlanie plików w archiwum i wyodrębnianie pojedynczych plików, ale oznacza, że ​​nie można wykorzystać nadmiarowości między wieloma plikami w tym samym archiwum w celu zwiększenia kompresji. Podczas gdy kompresowanie już skompresowanego pliku nie powoduje dalszego zmniejszenia jego rozmiaru, czasami może się pojawić plik zip w pliku zip: pierwsze skompresowanie zamieniło wiele małych plików w jeden duży plik (prawdopodobnie z wyłączoną kompresją), a drugi skompresowanie, a następnie skompresowane jako pojedynczy obiekt.

Między różnymi platformami i filozofiami gzipwystępuje zapylenie krzyżowe: jest to zasadniczo zipkompresor bez archiwizatora i xzzasadniczo 7-zipjest kompresorem bez archiwizatora.

Istnieją inne wyspecjalizowane sprężarki. Warianty PPM i ich następca ZPAQsą zoptymalizowane pod kątem maksymalnej kompresji bez względu na zużycie zasobów. Mogą łatwo przeżuć tyle procesora i pamięci RAM, ile można na nich rzucić, a dekompresja jest tak samo obciążająca jak kompresja (dla kontrastu, większość powszechnie używanych narzędzi kompresji jest asymetryczna : dekompresja jest tańsza niż kompresja).

Na drugim końcu spektrum lzo, snappya LZ4są „lekkie” sprężarki przeznaczone do maksymalnej prędkości i minimalnym zużyciu zasobów kosztem kompresji. Są szeroko stosowane w systemach plików i innych magazynach obiektów, ale w mniejszym stopniu jako samodzielne narzędzia.


Więc co wybrać?

Archiwizacja:

Ponieważ korzystasz z systemu Ubuntu, nie ma prawdziwego powodu, aby używać czegokolwiek innego niż tardo archiwizacji, chyba że próbujesz stworzyć pliki, które można łatwo odczytać w innym miejscu.

zipjest trudny do pokonania za wszechobecność, ale nie jest uniksowy i nie zachowa uprawnień systemu plików i informacji o własności, a jego wbudowana kompresja jest przestarzała. 7-zip i RAR (i ZPAQ) mają bardziej nowoczesną kompresję, ale są równie nieodpowiednie do archiwizacji systemów plików Unix (chociaż nic nie stoi na przeszkodzie, aby używać ich tak samo jak kompresorów); RAR jest również zastrzeżony.

Kompresja:

Aby uzyskać maksymalną kompresję, możesz zapoznać się z testem porównawczym, takim jak ogromny na stronie http://mattmahoney.net/dc/text.html . To powinno dać ci lepsze pojęcie o kompromisach.

Prawdopodobnie nie chcesz jednak maksymalnej kompresji. Jest o wiele za drogie.

xzjest najpopularniejszym narzędziem do kompresji ogólnego zastosowania we współczesnych systemach uniksowych. Wierzę, że 7-zip może również odczytywać pliki XZ, ponieważ są one ściśle powiązane.

Wreszcie: jeśli archiwizujesz dane w celach innych niż przechowywanie krótkoterminowe, powinieneś wybrać coś o otwartym kodzie źródłowym i najlepiej rozpowszechnione, aby później zminimalizować bóle głowy.

sześciokąt
źródło
1

lzo, gz, b2, lzma (.lzma2 =.xz)są kompresorami „strumieniowymi”: kompresują strumień bajtów, których nie znają i nie dbają o pliki, katalogi i metadane, takie jak uprawnienia. Musisz użyć archiwizatora takiego jak tar, aby spakować wszystkie te dane w strumień bajtów (plik tar) i skompresować je za pomocą kompresora. Jeśli są to dane jednego pliku, na których ci zależy, możesz również podać ten plik samemu do jednego z tych kompresorów.

Tar, cpio and paxsą archiwizatorami: biorą kilka plików i katalogów i kodują dane i metadane w jednym pliku. smoła jest najbardziej popularna i najbardziej kompatybilna, chociaż zalety techniczne między tymi trzema są na tyle minimalne, że o świcie trwały wojny religijne.

7z i zip to kompresory ORAZ arcihvers: Następnie przechowuj wszystkie dane i metadane i kompresuj je. Jednak AFAICT, żadne z nich nie zapisuje uprawnień uniksowych.

Zip używa tego samego algorytmu co gzip o nazwie DEFLATE. 7z używa algorytmu LZMA

aby odczytać pojedynczy plik z tar.gz lub podobnego, będziesz musiał zdekompresować cały strumień gz, dopóki wystarczająca liczba pliku tar nie zostanie ujawniona, abyś mógł go rozpakować. Zip umożliwia kompresowanie i wyciąganie każdego pliku osobno. 7z może mieć dowolne zachowanie.

Współczynniki kompresji i prędkości: gzip i lzo mają bardzo szybkie prędkości kompresji i dekompresji, ale niskie proporcje kompresji. Kompresja nie zajmuje również dużo pamięci. gzip jest trochę wolniejszy i daje nieco lepszy współczynnik kompresji niż lzo.

Jest tak szybki, że szybsze może być odczytanie skompresowanego pliku gz lub lzo z dysku i rozpakowanie go w locie zamiast odczytu nieskompresowanego pliku bezpośrednio z dysku.

LZMA (xz) zapewnia doskonałą kompresję ogólnych danych, ale kompresowanie i dekompresja zajmuje bardzo dużo czasu, a także kompresowanie znacznej ilości pamięci.

bz2 był kiedyś wybranym algorytmem wysokiej kompresji, ale wypadł z faworyzowania, ponieważ jest zarówno wolniejszy niż lzma, jak i zajmuje więcej czasu na kompresję i dekompresję. Jednak w przypadku niektórych rodzajów danych (sekwencje DNA, pliki z bardzo dużymi seriami tego samego bajtu itp.) Bzip2 może pobić wszystko inne. Jako przykład, kiedyś musiałem skompresować plik 4 GB z 1, a b2 zredukował i do kilku 10 kb, podczas gdy lzma zabrał około 10 MB, jeśli dobrze pamiętam.

staticd
źródło
W rzeczywistości LZMA jest dość szybka w dekompresji.
psusi
0

Możesz używać szczególnie dużych plików rzip. Najpierw sprawdza nadmiarowe dane w dużych blokach o wielkości 900 MB, koduje je, a następnie przekazuje dane do bzip2 (nie do końca, ale używane są te same algorytmy).

Efekt? Znacznie szybszy niż xz, lzmalub bzip2, i z mojego doświadczenia wynika, że ​​jego współczynnik kompresji jest lepszy niż w przypadku lzma. Jest to jednak wieprz RAM.

http://en.wikipedia.org/wiki/Rzip

użytkownik258532
źródło