Farklı “sıkıştırma” sistemleri arasındaki fark nedir?


9

Sıkıştırma için her zaman TAR ve ZIP kullandım, ancak son zamanlarda *.Zsıkıştırma algoritmasını duydum . Bu benim için bir soru getirdi:

Tüm bu sıkıştırma sistemlerinde, genel kullanım ve sıkıştırma için hangisi en iyisidir?

Birkaç test çalıştırarak, keşfettiğim targibi, gerçekten sıkıştırılmadığını (açıkça belirtilmedikçe) keşfettim. Yani, diğer sıkıştırma yöntemlerine kıyasla neye yarar?

Ben Posta En sık kullanılan sıkıştırma sistemi olduğunu zaten farkındayım, ama yerine kullanmalısınız *.Z, *.7z, .tarveya .tar.<insert ending here>?

Gönderi Özeti:

  1. Ben kullanmalı mıyım *.tar, *.Z, *.7z, .tar, ya da .tar.<insert ending here>en iyi sıkıştırma için?
  2. Düz *.tarsıkıştırmazsa, neden kullanıyoruz?

DÜZENLEME: Tüm algoritmalar Linux izinlerinin depolanmasına izin vermez (öğrendiklerimden). Hangisi var ve izinleri saklamak için kullanabileceğim bir tür kesmek (veya komut dosyası) var mı?


Bu şeyleri söylemenize gerek yok, sadece en iyi oyu alan birini seçin ya da en yararlı bulduğunuzu seçin :)
Seth

Yanıtlar:


17

tarteyp arşivi anlamına gelir. Tek yaptığı, dosyaları ve meta verilerini (izinler, sahiplik, vb.) Bir teyp sürücüsünde (veya bir dosyada) depolanabilen ve daha sonra geri yüklenebilen bir bayt akışına paketlemektir. Sıkıştırma, istendiğinde sıkıştırmak için çıkışı harici bir yardımcı program aracılığıyla bağlamak zorunda olduğunuz tamamen ayrı bir konudur. GNU katran, çıkışı uygun yardımcı program aracılığıyla otomatik olarak kısayol olarak filtrelemesini söyleyecek anahtarlar eklemek için yeterince güzeldi.

Zip ve 7z, arşivleme ve sıkıştırmayı kendi kapsayıcı biçiminde birleştirir ve dosyaları DOS / Windows sisteminde paketlemek içindir, böylece unix izinlerini ve sahipliğini saklamazlar. Bu nedenle, uygun yedeklemeler için izinleri saklamak istiyorsanız, tar ile devam etmeniz gerekir. Windows kullanıcılarıyla dosya alışverişi yapmayı planlıyorsanız, zip veya 7z iyidir. Zip ve 7zip kullanımının gerçek sıkıştırma algoritmaları, tar ile, sırasıyla uzing gzipve lzmakullanılabilir.

lzma (aka. * .xz) en iyi sıkıştırma oranlarından birine sahiptir ve dekompresyonda oldukça hızlıdır ve bu günlerde en iyi seçimdir. Bununla birlikte, sıkıştırmak için bir ton koç ve cpu süresi gerektirir. Saygıdeğer gzipsıkıştırmada biraz daha hızlıdır, bu yüzden bu kadar cpu zamanı ayırmak istemiyorsanız kullanılabilir. Ayrıca lzop adı verilen daha da hızlı bir varyantı var. bzip27zip / lzma gelmeden önce bir süre gzip'in yerini aldığı için hala oldukça popülerdir, çünkü daha iyi sıkıştırma oranları elde etti, ancak 7z / lzma dekompresyonda daha hızlı olduğu ve daha iyi sıkıştırma oranları elde ettiği için bu günler lehine düşüyor. compressNormalde isimleri dosyaları .Z * yarar, eski ve unutulmuş olduğunu.

Zip ve katran arasındaki diğer önemli farklardan biri, zip'in verileri küçük parçalar halinde sıkıştırmasıdır, oysa bir tar dosyasını sıkıştırdığınızda, her şeyi bir kerede sıkıştırırsınız. İkincisi daha iyi sıkıştırma oranları verir, ancak arşivin sonunda tek bir dosyayı ayıklamak için, ona ulaşmak için her şeyi açmanız gerekir. Böylece zip formatı, büyük bir arşivden tek bir dosya veya iki dosya çıkarmada daha iyidir. 7z ve darkolay parçalı çıkarma için her şeyi ("katı" mod olarak adlandırılır) veya küçük parçaları sıkıştırmayı seçmenize izin verin.


Ancak, yalnızca TAR meta verileri destekliyor mu? Yoksa gzip / bzip2 artık meta veriyi de destekliyor mu
Kaz Wolfe

@pacificfils, sıkıştırma yardımcı programları meta verileri olmadan yalnızca tek bir dosyayı sıkıştırır.
Mart'ta psusi

bir klasör katran ve sonra bir zip koymak ve olsa izinleri koruyabilirsiniz?
Kaz Wolfe

@pacificfils, evet, ama zip avantajlarından ve daha iyi sıkıştırma oranından vazgeçeceğiniz için biraz saçma olurdu gzip.
Mart'ta psusi

@pacificfils tar cfpizinleri koruyacaktır. Bir tar dosyası sıkıştırılmamıştır, bu nedenle zip (7-zip), gzip2, gzip, lzo, vb. Bir tar dosyasını iyi sıkıştırır (genel olarak, sıkıştırılmış dosyaların bir tar sıkıştırılabilir olması olası değildir).
Elliott Frisch

9

Algoritmalarının ayrıntıları burada konu dışı olan 1 onlar Linux için herhangi bir yolu özgü olmayan beri yalnız Ubuntu izin. Bununla birlikte, burada güzel bilgiler bulacaksınız .

Şimdi, tardediğin gibi, tarbir sıkıştırma programı değil ve hiç olmadı. Bunun yerine bir arşivleyicidir ; asıl amacı, küçük dosyalardan büyük bir dosya oluşturmaktır. Tarihsel olarak bu, teyp sürücülerinde depolamayı kolaylaştırmaktı, dolayısıyla adı: Tape ARchive.

Bugün, birincil neden tarsisteminizdeki dosya sayısını azaltmaktır. Unix dosya sistemindeki her dosya bir inode alır, ne kadar fazla dosyaya sahip olursanız, daha az sayıda inode kullanılabilir ve inode'unuz bittiğinde artık yeni dosya oluşturamazsınız. Basitçe söylemek gerekirse, binlerce dosya olarak depolanan aynı miktarda veri, tek bir katran arşivindeki aynı dosyalardan daha fazla sabit diskinizi alacaktır.

Bu, yorumlarda tartışıldığı için, 68G bölümümde /, aşağıdaki toplam ve kullanılan düğüm sayısına sahibim (inode sayısının dosya sistemi türüne ve bölümün boyutuna bağlı olduğunu unutmayın):

Inode count:              393216
Free inodes:              171421

Şimdi inode'umdan daha fazla dosya oluşturmaya devam edersem:

$ 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

Yer yok? Ama çok fazla alanım var:

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

Yukarıda da görebileceğiniz gibi, birkaç yüz bin boş dosya oluşturmak benim düğümümü hızla tüketiyor ve artık yenilerini oluşturamıyorum. Eğer tarbunlara olsaydım tekrar dosya oluşturmaya başlayabilirdim.

Daha az dosyaya sahip olmak, özellikle NFS'ye bağlı dosya sistemlerinde dosya sistemi G / Ç'sini büyük ölçüde hızlandırır. Daha az dosyam olduğu için bir proje bittiğinde her zaman eski çalışma dizinlerimi katlarım, daha hızlı programlar findçalışacaktır.

Süper Kullanıcı'da çok daha ayrıntılı olan harika bir cevap var, ancak yukarıdakilere ek olarak, tarbugün hala popüler olmanın diğer temel nedenleri :

  1. Verimlilik: ara dosyaların oluşturulmasını önlediğinden, tarbir sıkıştırma programı aracılığıyla boru kullanmak gzipdaha etkilidir.

  2. tar her türlü çan ve ıslık ile birlikte gelir, uzun geçmişi boyunca * nix yedeklemeleri için özellikle yararlı kılan özellikler (düşünme izinleri, dosya sahipliği, verileri doğrudan STDOUT'a ve bir SSH bağlantısı üzerinden aktarma yeteneği ... )

  3. Eylemsizlik. Biz alışkınız tar. Kullanabileceğiniz * nix'lerde kullanılabileceğini varsaymak güvenlidir, bu da onu kaynak kodu tarball'ları için çok taşınabilir ve kullanışlı hale getirir.


1 Bu kesinlikle doğrudur ve açıklamak için yeterince bilmediğim gerçeği ile ilgisi yoktur :)


3
Bilgisayarımda (geçmişte) 10.000.000 dosya vardı ve bu çok da çılgınca değil. Asla tar"dosya sayısını azaltmak" için kullanmıyorum çünkü çoğu dosya sistemi açıkçası umursamıyor ve tardosyalara rasgele erişimi kolay bir şekilde desteklemediğinden zaten gerçekten optimal değil. Aksine, ana kullanım (benim için ve çoğu kişi için düşünüyorum) dosyaları (örneğin kaynak kodu) diğer insanlarla basit bir şekilde paylaşmaktır.
nneonneo

@nneonneo Hiç tek bir dizinde milyonlarca dosyayla çalışmak zorunda kaldınız mı? İnanıyorum ve inan bana kolay değil. Oldukça belirgin sorunların yanı sıra ARG_MAX, bu, dosyalarınızla herhangi bir şekilde uğraşmanıza neden olabilir ve aslında dosyaların merkezi bir sunucuda depolandığı ve NFS ile dizlerinin paylaşıldığı (kötü) bir kurulum ağı getirebilir. Toplam dosya sayısını azaltmaya gelince, fark etmekten çok daha fazla dosyaya ihtiyacınız olacak, ancak çok kullanıcılı kurulumlarda, düğümlerin sayısı gerçekten sınırlanabilir.
Mart'ta terdon

@nneonneo daha somut bir örnek vermek için tune2fs -l$ HOME'umu tutan bölümde bana 19.300.352 inode sahip olduğumu söylüyor. Bundan daha fazla dosya oluşturamayacağım. Dediğiniz gibi, 10 ^ 6 deli değil, hatta daha yüksek aralıklarda bile değil. Eğer ihtiyacı var olabilir ne yaptığını bağlı şekilde bundan daha.
terdon

@nneonneo, inode'ların nasıl kolayca tükenebileceğine dair gerçek bir dünya örneği için güncellenmiş cevaba bakın.
terdon

Sunucum sadece 1 milyondan fazla inode kullanıyor ve bunun nedeni metrik tonluk bir e-postam (yıllarca geri dönen çok sayıda yüksek trafik posta listesi) ve Maildir biçiminde saklamam. 19 milyon inode kullanmak için ne yapabileceğiniz hakkında hiçbir fikrim yok. 7 ay boyunca günde 24 saat, her saniye yeni bir dosya oluşturmanız gerekir.
Mart'ta psusi

4

İki farklı fakat ilgili görev vardır. Bir dosya ağacının (dosya adları, dizin yapısı, dosya sistemi izinleri, sahiplik ve diğer meta veriler dahil) bir bayt akışına paketlenmesine arşivleme denir . Daha küçük bir bayt akışı üretmek için bir bayt akışındaki fazlalığın kaldırılmasına sıkıştırma adı verilir .

Unix'te iki işlem, her biri için ayrı araçlarla ayrılır. Diğer birçok platformda (mevcut ve geçmiş) birleştirilmiş araçlar hem arşivleme hem de sıkıştırma gerçekleştirir.

(gzip ve gzip'in arayüzünü taklit eden diğer programlar genellikle orijinal dosya adını sıkıştırılmış çıktıda saklama seçeneğine sahiptir, ancak bu, bir CRC veya bozulmayı tespit etmek için başka bir kontrolle birlikte depolayabilecekleri tek meta veridir.)

Sıkıştırmayı arşivlemeden ayırmanın avantajları vardır. Arşivleme platforma özgüdür (korunması gereken dosya sistemi meta verileri büyük ölçüde değişir), ancak uygulama basittir, büyük ölçüde G / Ç'ye bağlıdır ve zamanla çok az değişir. Sıkıştırma platformdan bağımsızdır, ancak uygulamalar CPU'ya bağlıdır ve algoritmalar, modern donanımın soruna katlanabileceği artan kaynaklardan yararlanmak için sürekli olarak gelişmektedir.

En popüler Unix arşivleyicisi, ve targibi başkaları olmasına rağmen . (Debian paketler ise arşivleri, genellikle açmasının Ramdisk'ler için kullanılmaktadır.) Ya da sık sık örneğin, sıkıştırma araçları ile kombine edilmiştir (.Z), (Gz), (.bz2) ve eski gelen genç (.xz), ve tesadüfen en kötüden en iyi sıkıştırmaya değil.cpioararcpiotarcompressgzipbzip2xz

Bir tararşiv oluşturmak ve sıkıştırmak farklı adımlardır: kompresör tardosya formatı hakkında hiçbir şey bilmez . Bu, sıkıştırılmış bir tararşivden tek bir dosyanın çıkarılmasının , önceki dosyaların tümünün sıkıştırılmasını gerektirdiği anlamına gelir . Buna genellikle "katı" arşiv denir.

Aynı şekilde, katran bir "akış" formatı - bir boru hattında yararlı olması için gerekli olduğundan - katran arşivinde küresel bir dizin yoktur ve katran arşivinin içeriğini listelemek de onu çıkarmak kadar pahalıdır.

Buna karşılık, Zip ve RAR ve 7-zip (modern Windows platformlarındaki en popüler arşivciler) genellikle her dosyayı ayrı ayrı sıkıştırır ve meta verileri hafifçe sıkıştırır. Bu, bir arşivdeki dosyaların ucuz bir şekilde listelenmesine ve tek tek dosyaların çıkarılmasına izin verir, ancak sıkıştırmayı artırmak için aynı arşivdeki birden fazla dosya arasındaki fazlalıktan yararlanamayacağı anlamına gelir. Genel olarak zaten sıkıştırılmış bir dosyayı sıkıştırmak dosya boyutunu daha da azaltmazken, bazen bir zip dosyası içinde bir zip dosyası görebilirsiniz: ilk zipping, çok sayıda küçük dosyayı büyük bir dosyaya dönüştürdü (muhtemelen sıkıştırma devre dışı bırakılmışsa). sonra tek bir varlık olarak sıkıştırılır.

Farklı platformlar ve felsefeler arasında çapraz tozlaşma vardır: gzipesasen ziparşivleyicisi olmayan kompresördür ve xzesas 7-zipolarak arşivleyicisi olmayan kompresörüdür.

Başka, özel kompresörler de var. PPM varyantları ve ardılları ZPAQ, kaynak tüketimine bakılmaksızın maksimum sıkıştırma için optimize edilmiştir. Onlara atabildiğiniz kadar CPU ve RAM'i kolayca çiğneyebilirler ve dekompresyon tıpkı sıkıştırma kadar vergilendirir (kontrast için en yaygın kullanılan sıkıştırma araçları asimetriktir : açma, sıkıştırmaktan daha ucuzdur).

Spektrumun diğer ucunda lzo, snappyve LZ4sıkıştırma pahasına maksimum hız ve minimum kaynak tüketimi için tasarlanmış "hafif" kompresörler vardır. Dosya sistemlerinde ve diğer nesne depolarında yaygın olarak kullanılırlar, ancak bağımsız araçlar gibi daha az kullanılırlar.


Peki hangisini seçmelisin?

arşivleme:

Ubuntu'da tarolduğunuzdan, başka bir yerde kolayca okunabilen dosyalar yapmaya çalışmadığınız sürece arşivleme dışında hiçbir şey kullanmanın gerçek bir nedeni yoktur .

zipher yerde bulunma zorluğu, ancak Unix merkezli değildir ve dosya sistemi izinlerinizi ve sahiplik bilgilerinizi korumaz ve pişmiş sıkıştırması eskidir. 7-zip ve RAR (ve ZPAQ) daha modern sıkıştırmaya sahiptir, ancak Unix dosya sistemlerini arşivlemek için eşit derecede uygun değildir (ancak bunları sadece kompresör olarak kullanmanızı engelleyen hiçbir şey olmamasına rağmen); RAR da tescilli.

Sıkıştırma:

Maksimum sıkıştırma için, http://mattmahoney.net/dc/text.html adresindeki muazzam gibi bir karşılaştırmaya bakabilirsiniz . Bu size ilgili ödünleşmeler hakkında daha iyi bir fikir verecektir.

Yine de muhtemelen maksimum sıkıştırma istemezsiniz. Çok pahalı.

xzmodern Unix sistemlerinde en popüler genel amaçlı sıkıştırma aracıdır. Ben 7-zip yakından ilişkili olduğu gibi, xz dosyalarını da okuyabileceğine inanıyorum.

Son olarak: kısa süreli depolama dışında herhangi bir şey için veri arşivliyorsanız, daha sonra baş ağrısını en aza indirmek için açık kaynaklı ve tercihen yaygın bir şey seçmelisiniz.


1

lzo, gz, b2, lzma (.lzma2 =.xz)"akış" kompresörleridir: bilmeyen bir bayt akışını sıkıştırırlar ve dosyalar, dizinler ve meta veriler gibi izinleri umursamazlar. Tüm bu verileri bir bayt akışına (tar dosyası) bir araya getirmek ve bunu bir kompresörle sıkıştırmak için tar gibi bir arşivleyici kullanmanız gerekir. Önem verdiğiniz tek bir dosyanın verileri ise, bu dosyayı yalnızca bu kompresörlerden birine de besleyebilirsiniz.

Tar, cpio and paxarşivcilerdir: bir grup dosya ve dizin alırlar ve verileri ve meta verileri tek bir dosyada kodlarlar. Katran en popüler ve en uyumlu olanıdır, ancak üçü arasındaki teknik değerler zamanın şafağında dini savaşlar olacak kadar minimaldir.

7z ve zip kompresörler VE arşivlerdir: Sonra tüm verileri ve meta verileri saklayın ve sıkıştırın. Ancak AFAICT, hiçbiri unix izinlerini kaydetmez.

Zip, DEFLATE adlı gzip ile aynı algoritmayı kullanır. 7z lzma algoritmasını kullanır

tar.gz ya da benzerinden tek bir dosyayı okumak için, tar dosyasının yeterli bir kısmı açığa çıkana kadar tüm gz akışını açmanız gerekir. Zip, her dosyayı ayrı ayrı sıkıştırmanıza ve çıkarmanıza olanak tanır. 7z her iki davranışa da sahip olabilir.

Sıkıştırma oranları ve hızları: gzip ve lzo çok yüksek sıkıştırma ve açma hızlarına sahiptir, ancak düşük sıkıştırma oranları vardır. Sıkıştırmak için çok fazla bellek gerektirmez. gzip biraz daha yavaştır ve lzo'dan biraz daha iyi sıkıştırma oranı verir.

Çok hızlı, bir gz veya lzo sıkıştırılmış dosyayı diskten okumak ve sıkıştırılmamış dosyayı doğrudan diskten okumak yerine anında açmak daha hızlı olabilir.

LZMA (xz) genel veriler üzerinde mükemmel sıkıştırma sağlar ancak sıkıştırmak ve sıkıştırmak için çok uzun zaman alır ve sıkıştırmak için önemli miktarda bellek alır.

bz2, tercih edilen yüksek sıkıştırma algoritmasıydı, ancak hem lzma'dan daha yavaş olduğu hem de sıkıştırılması ve sıkıştırmasının açılması daha uzun sürdüğü için gözden düştü. Ancak belirli veri türleri için (dna dizileri, aynı baytın çok büyük çalışmalarına sahip dosyalar vb.) Bzip2, diğer her şeyi ellerden aşağı atabilir. Örnek olarak, bir keresinde 1GB'lık 4GB'lık bir dosyayı sıkıştırmak zorunda kaldım ve b2 doğru bir şekilde hatırlarsam lzma'nın 10'unu aldı.


Aslında lzma açmada oldukça hızlıdır.
Mart'ta psusi

0

Özellikle büyük dosyalar için kullanabilirsiniz rzip. İlk olarak 900 MB büyük blok içindeki gereksiz verilere bakar, bunları kodlar ve daha sonra verileri bzip2'ye verir (gerçekte değil, aynı algoritmalar kullanılır).

Etki? Çok daha hızlı xz, lzmaya da bzip2, ve benim durumumda, sıkıştırma oranı ile karşılaştırıyor lzma. Yine de bir RAM domuzudur.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.