Zawsze używałem TAR i ZIP do kompresji, ale ostatnio słyszałem o *.Z
algorytmie 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 tar
tak 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:
- Powinno się używać
*.tar
,*.Z
,*.7z
,.tar
, lub.tar.<insert ending here>
za najlepszą kompresję? - Jeśli zwykły
*.tar
nie 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ń?
źródło
Odpowiedzi:
tar
oznacza 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
gzip
ilzma
.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
gzip
jest 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.bzip2
jest 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.compress
Narzę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
dar
pozwala ci wybrać kompresję całości (zwanej trybem „stałym”) lub małych kawałków, aby ułatwić ekstrakcję fragmentaryczną.źródło
gzip
.tar cfp
zachowa 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).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ś,tar
nie 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
tar
jest 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):Jeśli teraz spróbuję utworzyć więcej plików niż mam i-węzły:
Nie ma miejsca? Ale mam dużo miejsca:
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
tar
zrobił, 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
find
bę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
tar
wciąż jest dziś popularna, to:Wydajność: używanie
tar
do przepuszczania przez podobny program kompresjigzip
jest bardziej wydajne, ponieważ pozwala uniknąć tworzenia plików pośrednich.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 ... )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ć :)
źródło
tar
do „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żtar
nie 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.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.tune2fs -l
na 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.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 jakcpio
iar
. (Pakiety Debiana sąar
archiwami, podczas gdycpio
są często używane do początkowych ramdysków.)tar
Jest lub było często łączone z narzędziami do kompresji, takimi jakcompress
(.Z),gzip
(.gz),bzip2
(.bz2) ixz
(.xz), od najstarszych do najmłodszych , i nieprzypadkowo od najgorszej do najlepszej kompresji.Tworzenie
tar
i kompresowanie archiwum to odrębne kroki: kompresor nie wie nic otar
formacie pliku. Oznacza to, że wyodrębnienie pojedynczego pliku ze skompresowanegotar
archiwum 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
gzip
występuje zapylenie krzyżowe: jest to zasadniczozip
kompresor bez archiwizatora ixz
zasadniczo7-zip
jest kompresorem bez archiwizatora.Istnieją inne wyspecjalizowane sprężarki. Warianty PPM i ich następca
ZPAQ
są 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
,snappy
aLZ4
są „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ż
tar
do archiwizacji, chyba że próbujesz stworzyć pliki, które można łatwo odczytać w innym miejscu.zip
jest 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.
xz
jest 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.
źródło
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 pax
są 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.
źródło
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
,lzma
lubbzip2
, i z mojego doświadczenia wynika, że jego współczynnik kompresji jest lepszy niż w przypadkulzma
. Jest to jednak wieprz RAM.http://en.wikipedia.org/wiki/Rzip
źródło