Saya selalu menggunakan TAR dan ZIP untuk kompresi, tetapi baru-baru ini saya telah mendengar tentang *.Z
algoritma 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:
- Apakah saya harus menggunakan
*.tar
,*.Z
,*.7z
,.tar
, atau.tar.<insert ending here>
untuk kompresi terbaik? - Jika polos
*.tar
tidak 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?
sumber
Jawaban:
tar
singkatan 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
gzip
danlzma
masing - 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
gzip
cukup 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.bzip2
masih 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. Thecompress
utilitas, 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
dar
memungkinkan Anda memilih untuk mengompres semuanya (disebut mode "solid") atau potongan kecil untuk ekstraksi sedikit demi sedikit.sumber
gzip
.tar cfp
akan 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).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,tar
tidak 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
tar
adalah 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):Jika sekarang saya melanjutkan untuk mencoba membuat lebih banyak file daripada yang saya miliki inode:
Tidak ada ruang? Tapi saya punya banyak ruang:
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
tar
ini 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
find
akan berfungsi.Ada jawaban yang bagus tentang Pengguna Super yang jauh lebih detail, tetapi di samping alasan di atas, alasan dasar lainnya mengapa
tar
masih populer saat ini adalah:Efisiensi: menggunakan
tar
pipa melalui program kompresi sepertigzip
lebih efisien karena menghindari pembuatan file perantara.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 ... )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 :)
sumber
tar
untuk "mengurangi jumlah file" karena sebagian besar filesystem terus terang tidak peduli, dan itu tidak benar-benar optimal karenatar
tidak 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.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.tune2fs -l
pada 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.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 seperticpio
danar
. (Paket Debian adalahar
arsip, sementaracpio
sering digunakan untuk ramital inital.)tar
Adalah atau telah sering dikombinasikan dengan alat kompresi seperticompress
(.Z),gzip
(.gz),bzip2
(.bz2) danxz
(.xz), dari yang tertua hingga yang termuda , dan bukan kebetulan dari kompresi terburuk hingga terbaik.Membuat
tar
arsip dan mengompresnya adalah langkah-langkah yang berbeda: kompresor tidak tahu apa-apa tentangtar
format file. Ini berarti bahwa mengekstraksi satu file daritar
arsip 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:
gzip
pada dasarnya adalahzip
kompresor tanpa pengaruhnya, danxz
pada dasarnya adalah7-zip
kompresor tanpa pengarsipannya.Ada kompresor khusus lainnya. Varian PPM dan penggantinya
ZPAQ
dioptimalkan 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
,snappy
danLZ4
adalah "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
tar
pengarsipan, kecuali Anda mencoba membuat file yang mudah dibaca di tempat lain.zip
sulit 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.
xz
adalah 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.
sumber
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 pax
adalah 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.
sumber
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
,lzma
ataubzip2
, dan dalam pengalaman saya, rasio kompresi menyaingilzma
. Ini adalah babi RAM.http://en.wikipedia.org/wiki/Rzip
sumber