Mengapa format arsip tar beralih ke kompresi xz untuk menggantikan bzip2 dan bagaimana dengan gzip?

202

Semakin banyak tararsip menggunakan xzformat berdasarkan LZMA2 untuk kompresi daripada bzip2(bz2)kompresi tradisional . Bahkan kernel.org membuat pengumuman " Selamat tinggal bzip2 " yang terlambat , 27 Desember 2013 , yang mengindikasikan sumber-sumber kernel mulai saat ini akan dirilis dalam format tar.gz dan tar.xz - dan di halaman utama situs web apa langsung yang ditawarkan di tar.xz.

Adakah alasan khusus yang menjelaskan mengapa ini terjadi dan apa relevansinya gzipdalam konteks ini?


sumber

Jawaban:

198

Untuk mendistribusikan arsip melalui Internet, hal-hal berikut umumnya menjadi prioritas:

  1. Rasio kompresi (yaitu, seberapa kecil kompresor membuat data);
  2. Waktu dekompresi (persyaratan CPU);
  3. Persyaratan memori dekompresi; dan
  4. Kompatibilitas (seberapa luas program dekompresi)

Memori kompresi & persyaratan CPU tidak terlalu penting, karena Anda dapat menggunakan mesin cepat besar untuk itu, dan Anda hanya perlu melakukannya sekali.

Dibandingkan dengan bzip2, xz memiliki rasio kompresi yang lebih baik dan waktu dekompresi yang lebih rendah (lebih baik). Namun, pada pengaturan kompresi yang biasanya digunakan - membutuhkan lebih banyak memori untuk didekompresi [1] dan agak kurang luas. Gzip menggunakan lebih sedikit memori daripada keduanya.

Jadi, arsip format gzip dan xz diposting, memungkinkan Anda untuk memilih:

  • Perlu mendekompres pada mesin dengan memori yang sangat terbatas (<32 MB): gzip. Diberikan, sangat tidak mungkin ketika berbicara tentang sumber kernel.
  • Perlu mendekompresi alat minimal yang tersedia: gzip
  • Ingin menghemat waktu pengunduhan dan / atau bandwidth: xz

Sebenarnya tidak ada kombinasi faktor realistis yang membuat Anda memilih bzip2. Jadi itu dihapus.

Saya melihat perbandingan kompresi di posting blog . Saya tidak mencoba mereplikasi hasil, dan saya menduga beberapa di antaranya telah berubah (kebanyakan, saya berharap xztelah membaik, sebagai yang terbaru.)

(Ada beberapa skenario khusus di mana implementasi bzip2 yang baik mungkin lebih disukai daripada xz: bzip2 dapat memampatkan file dengan banyak nol dan urutan genom DNA lebih baik daripada xz. Versi xz yang lebih baru sekarang memiliki mode blok (opsional) yang memungkinkan pemulihan data setelah titik korupsi dan kompresi paralel dan [dalam teori] dekompresi. Sebelumnya, hanya bzip2 yang menawarkan ini. [2] Namun tidak ada yang relevan untuk distribusi kernel)


1: Dalam ukuran arsip, xz -3ada sekitar bzip -9. Kemudian xz menggunakan lebih sedikit memori untuk melakukan dekompresi. Tetapi xz -9(seperti, misalnya, digunakan untuk tarbal kernel Linux) menggunakan lebih dari bzip -9. (Dan bahkan xz -0membutuhkan lebih dari gzip -9).

2: Perubahan Luas Sistem F21: lbzip2 sebagai implementasi bzip2 default

derobert
sumber
Adakah komentar tentang topik toleransi kesalahan atau apakah itu sesuatu yang selalu diterapkan sepenuhnya di luar algoritma kompresi?
1
@ iluminÉ ketahanan tidak dapat diberikan tanpa mengorbankan rasio kompresi. Ini masalah ortogonal, dan sementara alat-alat seperti Parchive ada, untuk mendistribusikan kernel TCP penanganan kesalahan melakukan pekerjaan dengan baik.
Tobu
2
@ illuminÉ Toleransi kesalahan (dengan asumsi Anda bermaksud sesuatu yang mirip dengan par2) biasanya tidak masalah dengan mendistribusikan arsip melalui Internet. Unduhan dianggap cukup andal (dan Anda bisa mengunduh ulang jika rusak). Tanda dan tanda kriptografi sering digunakan, dan mereka mendeteksi korupsi serta gangguan. Ada kompresor yang memberikan toleransi kesalahan lebih besar, meskipun dengan biaya rasio kompresi. Tampaknya tidak ada yang menemukan pertukaran yang layak untuk unduhan HTTP atau FTP.
derobert
xz menggunakan memori KURANG untuk melakukan dekompresi.
MichalH
@ Mike Apakah sudah berubah sejak saya menulis ini? Secara khusus, catatan kaki satu menjelaskan penggunaan memori.
derobert
45

Pertama-tama, pertanyaan ini tidak terkait langsung dengan tar. Tar hanya membuat arsip yang tidak terkompresi, kompresi kemudian diterapkan kemudian.

Gzip dikenal relatif cepat jika dibandingkan dengan LZMA2 dan bzip2. Jika kecepatan penting, gzip(terutama implementasi multithreaded pigz) seringkali merupakan kompromi yang baik antara kecepatan kompresi dan rasio kompresi. Meskipun ada alternatif jika kecepatan adalah masalah (misalnya LZ4).

Namun, jika rasio kompresi yang tinggi diinginkan, LZMA2 mengalahkan bzip2di hampir setiap aspek. Kecepatan kompresi sering kali lebih lambat, tetapi lebih cepat terurai dan memberikan rasio kompresi yang lebih baik dengan biaya penggunaan memori yang lebih tinggi.

Tidak ada banyak alasan untuk menggunakan bzip2lagi, kecuali kompatibilitas mundur. Selain itu, LZMA2 dirancang dengan multithreading dalam pikiran dan banyak implementasi secara default menggunakan CPU multicore (sayangnya xzdi Linux belum melakukan ini, belum). Ini masuk akal karena kecepatan clock tidak akan meningkat lagi tetapi jumlah core akan bertambah.

Ada bzip2implementasi multithreaded (misalnya pbzip), tetapi mereka sering tidak diinstal secara default. Perhatikan juga bahwa multithreaded bzip2hanya benar-benar membayar saat mengompresi sedangkan dekompresi menggunakan utas tunggal jika file dikompresi menggunakan ulir tunggal bzip2, berbeda dengan LZMA2. bzip2Varian paralel hanya dapat memanfaatkan CPU multicore jika file dikompresi menggunakan bzip2versi paralel , yang seringkali tidak demikian.

Marco
sumber
4
Nah beberapa tars grok zopsi.
tchrist
"speed" menghasilkan jawaban yang kacau, Anda harus merujuk pada kecepatan kompresi atau kecepatan dekompresi. Pixz, pbzip2 atau pigz tidak diinstal secara default (atau digunakan oleh tar tanpa flag -I), tetapi pixz dan pbzip2 mempercepat kompresi dan dekompresi dan pigz hanya untuk kompresi.
Tobu
@Tobu xzakan multithreaded secara default sehingga pixzinstalasi tidak diperlukan di masa depan. Pada beberapa platform, xzthreading sudah didukung. Sedangkan bzip2tidak mungkin multithreaded karena format tidak dirancang dengan multithreading dalam pikiran. Selain itu, pbzip2hanya mempercepat dekompresi jika file telah dikompresi menggunakan pbzip2yang sering tidak terjadi.
Marco
1
@ Mars Saya percaya lbzip2 memungkinkan untuk dekompresi paralel file bahkan jika mereka dikompresi dengan implementasi non-paralel (misalnya stock bzip2). Itu sebabnya saya menggunakan lbzip2 lebih dari pbzip2. (Mungkin ini telah berevolusi sejak komentar Anda.)
RaveTheTadpole
19

Jawaban singkat : xz lebih efisien dalam hal rasio kompresi. Sehingga menghemat ruang disk dan mengoptimalkan transfer melalui jaringan.
Anda dapat melihat Tolok Ukur Cepat ini untuk mengetahui perbedaannya dengan tes praktis.

Slyx
sumber
Tautan rusak.
flarn2006
18

LZMA2 adalah sistem kompresi blok sedangkan gzip tidak. Ini berarti bahwa LZMA2 cocok untuk multi-threading. Juga, jika korupsi terjadi dalam arsip, Anda biasanya dapat memulihkan data dari blok berikutnya dengan LZMA2 tetapi Anda tidak dapat melakukan ini dengan gzip. Dalam praktiknya, Anda kehilangan seluruh arsip dengan gzip setelah blok rusak. Dengan arsip LZMA2, Anda hanya kehilangan file yang dipengaruhi oleh blok yang rusak. Ini penting dalam arsip yang lebih besar dengan banyak file.

Mark Warburton
sumber
2
Ini adalah perbedaan yang sangat berguna dan penting!
leden