Apa perbedaan antara sistem “kompresi” yang berbeda?

9

Saya selalu menggunakan TAR dan ZIP untuk kompresi, tetapi baru-baru ini saya telah mendengar tentang *.Zalgoritma kompresi. Ini memunculkan pertanyaan bagi saya:

Dengan semua sistem kompresi ini, mana yang terbaik untuk penggunaan umum dan kompresi?

Menjalankan beberapa tes, saya telah menemukan bahwa tar, seperti yang saya temukan, TIDAK benar-benar kompres (kecuali ditentukan secara eksplisit). Artinya, apa gunanya dibandingkan dengan metode kompresi lainnya?

Saya sudah menyadari bahwa ZIP adalah sistem kompresi yang paling banyak-digunakan, tapi harus saya menggunakannya bukan *.Z, *.7z, .tar, atau .tar.<insert ending here>?

Ringkasan Posting:

  1. Apakah saya harus menggunakan *.tar, *.Z, *.7z, .tar, atau .tar.<insert ending here>untuk kompresi terbaik?
  2. Jika polos *.tartidak kompres, mengapa kita menggunakannya?

EDIT: Tidak semua algoritma memungkinkan penyimpanan izin Linux (dari apa yang saya pelajari). Ya, dan apakah ada semacam retasan (atau skrip) yang dapat saya gunakan untuk menyimpan izin?

Kaz Wolfe
sumber
Tidak perlu mengatakan hal-hal itu, cukup pilih yang teratas terpilih atau yang menurut Anda paling membantu :)
Seth

Jawaban:

17

tarsingkatan arsip rekaman. Semua yang dilakukannya adalah mengemas file, dan metadata mereka (izin, kepemilikan, dll) menjadi aliran byte yang dapat disimpan pada tape drive (atau file) dan dikembalikan lagi nanti. Kompresi adalah hal yang sepenuhnya terpisah yang harus Anda gunakan untuk menyalurkan output melalui utilitas eksternal untuk kompres jika menginginkannya. Tar GNU cukup bagus untuk menambahkan sakelar agar ia menyaring keluaran secara otomatis melalui utilitas yang sesuai sebagai pintasan.

Zip dan 7z menggabungkan pengarsipan dan kompresi bersama ke dalam format wadah mereka sendiri, dan mereka dimaksudkan untuk mengemas file pada sistem DOS / Windows, sehingga mereka tidak menyimpan izin dan kepemilikan unix. Jadi, jika Anda ingin menyimpan izin untuk pencadangan yang tepat, Anda harus tetap menggunakan tar. Jika Anda berencana untuk bertukar file dengan pengguna Windows, maka zip atau 7z baik. Algoritma kompresi aktual yang digunakan zip dan 7zip dapat digunakan dengan tar, dengan menggunakan gzipdan lzmamasing - masing.

lzma (alias. * .xz) memiliki salah satu rasio kompresi terbaik, dan cukup cepat dalam dekompresi, menjadikannya pilihan utama akhir-akhir ini. Namun demikian, membutuhkan satu ton ram dan waktu cpu untuk kompres. Yang terhormat gzipcukup sedikit lebih cepat pada kompresi, jadi dapat digunakan jika Anda tidak ingin mendedikasikan waktu cpu sebanyak itu. Ini juga memiliki varian lebih cepat yang disebut lzop. bzip2masih cukup populer karena sebagian besar menggantikan gzip untuk sementara waktu sebelum 7zip / lzma muncul, karena mendapat rasio kompresi yang lebih baik, tetapi hari ini tidak disukai karena 7z / lzma lebih cepat pada dekompresi dan mendapatkan rasio kompresi yang lebih baik. The compressutilitas, yang biasanya nama file * .Z, kuno dan lama terlupakan.

Salah satu perbedaan penting lainnya antara zip dan tar adalah bahwa zip mengkompres data dalam potongan kecil, sedangkan ketika Anda mengompres file tar, Anda mengompres semuanya sekaligus. Yang terakhir memberikan rasio kompresi yang lebih baik, tetapi untuk mengekstraksi satu file di akhir arsip, Anda harus mendekompres semuanya untuk mendapatkannya. Dengan demikian format zip lebih baik dalam mengekstraksi satu atau dua file dari arsip besar. 7z dan darmemungkinkan Anda memilih untuk mengompres semuanya (disebut mode "solid") atau potongan kecil untuk ekstraksi sedikit demi sedikit.

psusi
sumber
Tapi, hanya TAR yang mendukung metadata? Atau apakah gzip / bzip2 juga sekarang mendukung metadata
Kaz Wolfe
@pacificfils, utilitas kompresi hanya memampatkan satu file, tanpa metadata.
psusi
bisakah satu tar folder dan kemudian meletakkannya di zip dan mempertahankan izin?
Kaz Wolfe
@pacificfils, ya, tapi itu akan sedikit konyol karena Anda akan menyerah manfaat zip, dan rasio kompresi yang lebih baik gzip.
psusi
@pacificfils tar cfpakan mempertahankan izin. File tar tidak terkompresi, jadi zip (7-zip), gzip2, gzip, lzo, dll semua akan mengkompres file tar dengan baik (secara umum, tar file terkompresi tidak mungkin kompresibel).
Elliott Frisch
9

Rincian algoritma di luar topik di sini 1 karena mereka sama sekali tidak spesifik untuk Linux, apalagi Ubuntu. Anda akan, bagaimanapun, menemukan beberapa info yang bagus di sini .

Sekarang tar, seperti yang Anda katakan, tartidak dan tidak pernah menjadi program kompresi. Sebaliknya, itu adalah pengarsip ; tujuan utamanya adalah membuat satu file besar dari banyak file kecil. Secara historis ini adalah untuk memfasilitasi penyimpanan pada drive tape, maka namanya: Tape ARchive.

Hari ini, alasan utama untuk digunakan taradalah untuk mengurangi jumlah file di sistem Anda. Setiap file pada sistem file Unix menggunakan inode , semakin banyak file yang Anda miliki, semakin sedikit inode yang tersedia dan ketika Anda kehabisan inode, Anda tidak lagi dapat membuat file baru. Sederhananya, jumlah data yang sama yang disimpan sebagai ribuan file akan memakan lebih banyak hard drive Anda daripada file-file yang sama dalam arsip tar tunggal.

Untuk mengilustrasikan, karena ini telah diperdebatkan dalam komentar, pada /partisi 68G saya , saya memiliki jumlah total dan inode yang digunakan berikut (perhatikan bahwa jumlah inode tergantung pada tipe sistem file dan ukuran partisi):

Inode count:              393216
Free inodes:              171421

Jika sekarang saya melanjutkan untuk mencoba membuat lebih banyak file daripada yang saya miliki inode:

$ 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

Tidak ada ruang? Tapi saya punya banyak ruang:

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

Seperti yang Anda lihat di atas, membuat beberapa ratus ribu file kosong dengan cepat menghabiskan inode saya dan saya tidak bisa lagi membuat yang baru. Jika saya ke tarini saya akan dapat mulai membuat file lagi.

Memiliki lebih sedikit file juga sangat mempercepat sistem file I / O terutama pada sistem file yang dipasang NFS. Saya selalu mencari direktori kerja lama saya ketika sebuah proyek selesai karena semakin sedikit file yang saya miliki, semakin cepat program seperti itu findakan berfungsi.

Ada jawaban yang bagus tentang Pengguna Super yang jauh lebih detail, tetapi di samping alasan di atas, alasan dasar lainnya mengapa tarmasih populer saat ini adalah:

  1. Efisiensi: menggunakan tarpipa melalui program kompresi seperti gziplebih efisien karena menghindari pembuatan file perantara.

  2. tar hadir dengan segala macam bel dan peluit, fitur yang telah dirancang selama sejarah panjangnya yang membuatnya sangat berguna untuk cadangan * nix (pikirkan izin, kepemilikan file, kemampuan untuk menyalurkan data langsung ke STDOUT dan melalui tautan SSH ... )

  3. Kelembaman. Kita terbiasa tar. Aman untuk menganggapnya akan tersedia pada * nix apa pun yang mungkin Anda gunakan yang membuatnya sangat portabel dan berguna untuk tarbal kode sumber.


1 Ini benar-benar benar dan tidak ada hubungannya dengan fakta bahwa saya tidak cukup tahu tentang mereka untuk menjelaskan :)

terdon
sumber
3
Komputer saya memiliki (di masa lalu) lebih dari 10.000.000 file, dan itu tidak terlalu gila. Saya tidak pernah menggunakan taruntuk "mengurangi jumlah file" karena sebagian besar filesystem terus terang tidak peduli, dan itu tidak benar-benar optimal karena tartidak mendukung akses acak yang mudah ke file. Sebaliknya, penggunaan utama (bagi saya dan saya pikir bagi kebanyakan orang) adalah untuk berbagi file (misalnya kode sumber) dengan orang lain dengan cara yang sederhana.
nneonneo
@nneonneo apakah Anda pernah bekerja dengan jutaan file dalam satu direktori? Saya sudah dan percaya saya itu tidak mudah. Terlepas dari masalah yang jelas dengan ARG_MAX, ini dapat membuat berurusan dengan file Anda dengan cara apa pun yang merepotkan dan benar-benar dapat membawa (buruk) mengatur jaringan di mana file disimpan di server pusat dan dibagikan dengan NFS ke lutut. Sedangkan untuk mengurangi jumlah file secara keseluruhan, Anda akan membutuhkan lebih banyak file daripada itu untuk diperhatikan tetapi dalam pengaturan multi-pengguna, jumlah inode memang bisa menjadi membatasi.
terdon
@nneonneo untuk memberikan contoh yang lebih konkret, tune2fs -lpada partisi yang memegang $ HOME saya memberitahu saya bahwa saya memiliki 19.300.352 inode. Saya tidak akan dapat membuat lebih banyak file dari itu. Seperti yang Anda katakan, 10 ^ 6 tidak gila, bahkan tidak dalam rentang yang lebih tinggi. Tergantung pada apa yang Anda lakukan Anda dapat memiliki kebutuhan cara lebih dari itu.
terdon
@nneonneo lihat jawaban yang diperbarui untuk contoh dunia nyata tentang bagaimana Anda dapat dengan mudah kehabisan inode.
terdon
Server saya menggunakan lebih dari 1 juta inode dan itu hanya karena saya memiliki metrik ton email (banyak milis lalu lintas tinggi akan kembali selama bertahun-tahun) dan menyimpannya dalam format Maildir. Saya tidak tahu apa yang mungkin Anda lakukan untuk menggunakan 19 juta inode. Anda harus membuat file baru setiap detik, 24 jam sehari, selama lebih dari 7 bulan.
psusi
4

Ada dua tugas yang berbeda tetapi terkait. Mengemas pohon file (termasuk nama file, struktur direktori, izin sistem file, kepemilikan dan metadata lainnya) ke dalam aliran byte disebut pengarsipan . Menghapus redundansi dalam aliran byte untuk menghasilkan aliran byte yang lebih kecil disebut kompresi .

Di Unix, kedua operasi dipisahkan, dengan alat yang berbeda untuk masing-masing. Pada sebagian besar platform lain (saat ini dan historis), alat gabungan melakukan pengarsipan dan kompresi.

(gzip dan program lain yang meniru antarmuka gzip sering memiliki opsi untuk menyimpan nama file asli dalam output terkompresi, tetapi ini, bersama dengan CRC atau cek lain untuk mendeteksi korupsi, adalah satu-satunya metadata yang dapat mereka simpan.)

Ada keuntungan untuk memisahkan kompresi dari pengarsipan. Pengarsipan adalah platform-spesifik (metadata filesystem yang perlu diawetkan sangat bervariasi), tetapi implementasinya mudah, sebagian besar terikat I / O, dan sedikit berubah seiring waktu. Kompresi adalah platform-independen, tetapi implementasi terikat oleh CPU dan algoritma terus meningkat untuk mengambil keuntungan dari peningkatan sumber daya yang dapat dibawa oleh perangkat keras modern untuk mengatasi masalah tersebut.

Pengarsip Unix paling populer adalah tar, meskipun ada yang lain seperti cpiodan ar. (Paket Debian adalah ararsip, sementara cpiosering digunakan untuk ramital inital.) tarAdalah atau telah sering dikombinasikan dengan alat kompresi seperti compress(.Z), gzip(.gz), bzip2(.bz2) dan xz(.xz), dari yang tertua hingga yang termuda , dan bukan kebetulan dari kompresi terburuk hingga terbaik.

Membuat tararsip dan mengompresnya adalah langkah-langkah yang berbeda: kompresor tidak tahu apa-apa tentang tarformat file. Ini berarti bahwa mengekstraksi satu file dari tararsip terkompresi membutuhkan dekompresi semua file sebelumnya. Ini sering disebut arsip "padat".

Sama halnya, karena tar adalah format "streaming" - yang diperlukan untuk berguna dalam saluran pipa - tidak ada indeks global dalam arsip tar, dan daftar isi arsip tar sama mahalnya dengan mengekstraknya.

Sebaliknya, Zip dan RAR dan 7-zip (pengarsip paling populer pada platform Windows modern) biasanya mengkompres setiap file secara terpisah, dan mengompres metadata dengan ringan jika sama sekali. Hal ini memungkinkan daftar file yang murah dalam arsip dan ekstraksi file individual, tetapi berarti redundansi antara banyak file dalam arsip yang sama tidak dapat dieksploitasi untuk meningkatkan kompresi. Sementara secara umum mengompresi file yang sudah dikompresi tidak mengurangi ukuran file lebih jauh, kadang-kadang Anda mungkin melihat file zip dalam file zip: zip pertama mengubah banyak file kecil menjadi satu file besar (mungkin dengan kompresi dinonaktifkan), yang kedua zip kemudian dikompresi sebagai satu kesatuan.

Ada penyerbukan silang antara platform dan filosofi yang berbeda: gzippada dasarnya adalah zipkompresor tanpa pengaruhnya, dan xzpada dasarnya adalah 7-zipkompresor tanpa pengarsipannya.

Ada kompresor khusus lainnya. Varian PPM dan penggantinya ZPAQdioptimalkan untuk kompresi maksimum tanpa memperhatikan konsumsi sumber daya. Mereka dapat dengan mudah mengolah CPU dan RAM sebanyak yang Anda bisa gunakan, dan dekompresi sama beratnya dengan kompresi (untuk kontras, alat kompresi yang paling banyak digunakan adalah asimetris : dekompresi lebih murah daripada mengompresi).

Di ujung lain dari spektrum, lzo, snappydan LZ4adalah "cahaya" kompresor dirancang untuk kecepatan maksimum dan konsumsi sumber daya minimum, pada biaya kompresi. Mereka banyak digunakan di dalam sistem file dan penyimpanan objek lain, tetapi kurang sebagai alat mandiri.


Jadi mana yang harus Anda pilih?

Pengarsipan:

Karena Anda menggunakan Ubuntu, tidak ada alasan nyata untuk menggunakan selain tarpengarsipan, kecuali Anda mencoba membuat file yang mudah dibaca di tempat lain.

zipsulit dikalahkan di mana-mana, tetapi ini bukan Unix-centric dan tidak akan menjaga izin sistem berkas dan informasi kepemilikan Anda, dan kompresi baked-in-nya sudah kuno. 7-zip dan RAR (dan ZPAQ) memiliki kompresi lebih modern tetapi sama-sama tidak cocok untuk pengarsipan sistem file Unix (walaupun tidak ada yang menghentikan Anda menggunakannya hanya sebagai kompresor); RAR juga merupakan hak milik.

Kompresi:

Untuk kompresi maksimum, Anda dapat melihat benchmark, seperti benchmark besar di http://mattmahoney.net/dc/text.html . Ini akan memberi Anda ide yang lebih baik dari pengorbanan yang terlibat.

Anda mungkin tidak ingin kompresi maksimum. Itu terlalu mahal.

xzadalah alat kompresi tujuan umum yang paling populer pada sistem Unix modern. Saya percaya 7-zip dapat membaca file xz juga, karena mereka terkait erat.

Terakhir: jika Anda mengarsipkan data untuk hal lain selain penyimpanan jangka pendek, Anda harus memilih sesuatu yang bersifat open-source dan sebaiknya tersebar luas, untuk meminimalkan sakit kepala di kemudian hari.

hexwab
sumber
1

lzo, gz, b2, lzma (.lzma2 =.xz)adalah "stream" compressor: mereka mengompres aliran bye yang tidak tahu dan tidak peduli dengan file, direktori dan izin metadata seperti. Anda harus menggunakan pengarsip seperti tar untuk menggabungkan semua data ke dalam aliran byte (file tar) dan kompres dengan kompresor. Jika itu adalah data dari satu file yang Anda pedulikan, Anda juga bisa memberi makan file itu sendiri ke salah satu kompresor ini.

Tar, cpio and paxadalah pengarsip: mereka mengambil banyak file dan direktori dan menyandikan data dan metadata dalam satu file. tar adalah yang paling populer dan paling kompatibel meskipun manfaat teknis antara ketiganya cukup minimal sehingga ada perang agama tentang hal itu selama fajar waktu.

7z dan zip adalah kompresor DAN arcihvers: Kemudian simpan semua data dan data meta dan kompres. Namun AFAICT, keduanya tidak menyimpan izin unix.

Zip menggunakan algoritma yang sama dengan gzip yang disebut DEFLATE. 7z menggunakan algoritma lzma

untuk membaca satu file dari tar.gz atau sejenisnya, Anda perlu mendekompres seluruh aliran gz sampai cukup file tar terekspos sehingga Anda dapat mengekstraknya. Zip memungkinkan Anda untuk mengompres dan mengeluarkan setiap file satu per satu. 7z dapat memiliki perilaku.

Rasio dan kecepatan kompresi: gzip dan lzo memiliki kecepatan kompresi dan dekompresi yang sangat cepat tetapi rasio kompresi rendah. Ini juga tidak membutuhkan banyak memori untuk kompres. gzip sedikit lebih lambat dan memberikan rasio kompresi yang sedikit lebih baik daripada lzo.

Begitu cepat, bisa lebih cepat membaca file terkompresi gz atau lzo dari disk dan mendekompresnya dengan cepat alih-alih membaca file yang tidak dikompresi langsung dari disk.

LZMA (xz) memberikan kompresi yang sangat baik pada data umum tetapi membutuhkan waktu sangat lama untuk kompres dan dekompresi bersama dengan mengambil sejumlah besar memori untuk kompres.

bz2 dulunya adalah algoritma kompresi pilihan tinggi tetapi tidak disukai karena keduanya lebih lambat dari lzma dan membutuhkan waktu lebih lama untuk kompres dan dekompresi. Namun untuk jenis data tertentu (dna urutan, file dengan berjalan sangat besar dari byte yang sama dll) bzip2 dapat mengalahkan segalanya dengan tangan lainnya. Sebagai contoh, saya pernah harus mengkompres file 4GB dari 1 dan b2 mengurangi saya menjadi beberapa 10 kb sementara lzma mengambil beberapa 10 MB jika saya ingat dengan benar.

staticd
sumber
Sebenarnya lzma cukup cepat dalam dekompresi.
psusi
0

Untuk file berukuran besar, Anda dapat menggunakannya rzip. Pertama-tama terlihat pada data yang berlebihan di dalam 900 MB blok besar, mengkodekan ini, dan kemudian menyerahkan data ke bzip2 (tidak juga, tetapi algoritma yang sama digunakan).

Efek? Jauh lebih cepat daripada xz, lzmaatau bzip2, dan dalam pengalaman saya, rasio kompresi menyaingi lzma. Ini adalah babi RAM.

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

pengguna258532
sumber