Alat Kompresi Multi-Core

61

Alat kompresi apa yang tersedia di Ubuntu yang dapat memanfaatkan CPU multi-core.

Luis Alvarado
sumber
Sebagai catatan, alternatifnya adalah membuat arsip independen secara paralel. Jadi alih-alih membuat myfiles.8core.xz, Anda membuat myfiles1.xz ke myfiles8.xz secara paralel. Ini akan membutuhkan agen pengiriman. Kedua pendekatan memiliki pro dan kontra yang saling melengkapi.
Acumenus
2
Mencoba meng-unzip file 7GB menggunakan bzip2 hanya untuk mengetahui bahwa itu tidak menggunakan semua 8 core saya. Baca tentang hal itu dan putuskan untuk mencoba pbzip2. Masih berjalan hanya pada satu inti. Kemudian saya perhatikan komentar mengatakan pbzip2 hanya dapat sepenuhnya memparalelkan dekompresi file yang dikompres sendiri. Komentar yang sama menyarankan lbzip2 dapat sepenuhnya memparalelkan pada file bz2 yang memang benar - membuat penggunaan penuh (80-90% dari CPU) dari semua core saya dan itu dekompresi jauh lebih cepat.
Edi Bice

Jawaban:

34

Ada dua alat utama. lbzip2dan pbzip2. Mereka pada dasarnya implementasi yang berbeda dari kompresor bzip2. Saya telah membandingkan mereka (outputnya adalah versi yang sudah dirapikan tetapi Anda harus dapat menjalankan perintah)

cd /dev/shm  # we do all of this in RAM!
dd if=/dev/urandom of=bigfile bs=1024 count=102400

$ lbzip2 -zk bigfile 
Time: 0m3.596s
Size: 105335428 

$ pbzip2 -zk bigfile
Time: 0m5.738s6
Size: 10532460

lbzip2tampaknya menjadi pemenang pada data acak. Ini sedikit kurang terkompresi tetapi jauh lebih cepat. YMMV.

Oli
sumber
5
sepertinya angka hilang dari Ukuran pbzip2
Wayne Walker
4
/dev/urandombukanlah pilihan input untuk alat kompresi benchmarking, karena data acak, menurut definisi, tidak dapat dimampatkan. Itu sebagian menjelaskan mengapa dalam kedua kasus file output ~ 450MiB lebih besar dari input.
ali_m
1
Maaf, saya benar-benar hebat tetapi data yang benar-benar acak bisa super-kompresibel. Anda bisa meminta RNG yang sempurna untuk 32 bit dan dapatkan 00000000000000000000000000000000. Begitulah cara kerja acak;) Yang Anda bicarakan adalah rata-rata praktis. Tidak mungkin Anda akan menghasilkan file 100MB hanya nol. Dan saya setuju dengan semangat apa yang Anda katakan, saya hanya tidak setuju dengan "oleh definisi" karena itu bukan definisi (karena itu tidak akurat).
Oli
2
Saat kami menilai kinerja berbagai metode kompresi, yang benar-benar kami minati adalah ukuran output yang diharapkan untuk contoh mendatang tentang jenis data yang ingin kami kompres. Jika data ini benar-benar acak maka tidak mengandung keteraturan statistik untuk dieksploitasi, jadi untuk urutan N byte acak yang terbaik yang bisa kita harapkan adalah panjang output yang diharapkan dari N byte. Untuk beberapa contoh kita mungkin melakukan sedikit lebih baik, untuk yang lain kita mungkin melakukan sedikit lebih buruk (dalam praktiknya kita hampir selalu melakukan lebih buruk), tetapi panjang output yang diharapkan tetap sama.
ali_m
5
Maksud saya "acak" dalam arti Kolmogorov , yang secara harfiah didefinisikan sebagai tidak dapat dimampatkan. Tidak ada patokan universal untuk kompresi karena algoritme yang berbeda berfungsi lebih baik untuk berbagai jenis data. Awal yang baik mungkin hanya dengan menyalurkannya beberapa teks, misalnya wget http://mattmahoney.net/dc/enwik8.zipuntuk mengambil 96MB (terkompresi 21MB) teks dari Wikipedia. Untuk serangkaian tolok ukur yang jauh lebih komprehensif, lihat di sini .
ali_m
72

Yah, kata kunci itu paralel . Setelah mencari semua alat kompresi yang juga paralel, saya menemukan yang berikut:

PXZ - Parallel XZ adalah utilitas kompresi yang mengambil keuntungan dari menjalankan kompresi LZMA dari berbagai bagian file input pada banyak core dan prosesor secara bersamaan. Tujuan utamanya adalah untuk memanfaatkan semua sumber daya untuk mempercepat waktu kompresi dengan pengaruh minimal yang mungkin pada rasio kompresi.

sudo apt-get install pxz

PLZIP - Lzip adalah kompresor data lossless berdasarkan pada algoritma LZMA, dengan pemeriksaan integritas yang sangat aman dan antarmuka pengguna yang mirip dengan salah satu dari gzip atau bzip2. Lzip mendekompresi hampir secepat gzip dan kompres lebih baik daripada bzip2, yang membuatnya cocok untuk distribusi perangkat lunak dan pengarsipan data.

Plzip adalah versi paralel besar (multi-threaded) dari lzip menggunakan format file lzip; file yang dihasilkan oleh plzip sepenuhnya kompatibel dengan lzip.

Plzip dimaksudkan untuk kompresi / dekompresi file besar yang lebih cepat pada mesin multiprosesor, yang membuatnya sangat cocok untuk distribusi file perangkat lunak besar dan pengarsipan data skala besar. Pada file yang cukup besar, plzip dapat menggunakan ratusan prosesor.

sudo apt-get install plzip

PIGZ - pigz, yang merupakan singkatan dari Implementasi Paralel GZip, adalah pengganti yang berfungsi penuh untuk gzip yang mengambil keuntungan dari banyak prosesor dan banyak inti saat mengompresi data.

sudo apt-get install pigz

PBZIP2 - pbzip2 adalah implementasi paralel dari kompresor blok-sortir file bzip2 yang menggunakan pthreads dan mencapai speedup dekat-linear pada mesin SMP. Output dari versi ini sepenuhnya kompatibel dengan bzip2 v1.0.2 (yaitu: apa pun yang dikompresi dengan pbzip2 dapat didekompresi dengan bzip2).

sudo apt-get install pbzip2

LRZIP - Program kompresi multithreaded yang dapat mencapai rasio dan kecepatan kompresi yang sangat tinggi saat digunakan dengan file besar. Ini menggunakan algoritma kompresi gabungan zpaq dan lzma untuk kompresi maksimum, lzo untuk kecepatan maksimum, dan redundansi jarak jauh pengurangan rzip. Ini dirancang untuk meningkatkan skala dengan peningkatan ukuran RAM, meningkatkan kompresi lebih lanjut. Pilihan optimasi ukuran atau kecepatan memungkinkan kompresi yang lebih baik daripada yang bisa disediakan oleh lzma, atau kecepatan yang lebih baik daripada gzip, tetapi dengan level kompresi berukuran bzip2.

sudo apt-get install lrzip

Benchmark Kompresi kecil (Menggunakan tes yang dibuat Oli):

UKURAN FILE ASLI - 100 MB
PBZIP2 - 101 MB (1% Lebih Besar)
PXZ - 101 MB (1% Lebih Besar)
PLZIP - 102 MB (1% Lebih Besar)
LRZIP - 101 MB (1% Lebih Besar)
PIGZ - 101 MB (1% Lebih Besar) )

Benchmark Kompresi kecil (Menggunakan file Teks):

UKURAN FILE ASLI - 70 KB File Teks
PBZIP2 - 16,1 KB (23%)
PXZ - 15,4 KB (22%)
PLZIP - 15,5 KB (22,1%)
LRZIP - 15,3 KB (21,8%)
PIGZ - 17,4 KB (24,8%)

Luis Alvarado
sumber
Contohnya akan sangat bagus.
earthmeLon
@earthmeLon Baca jawaban oleh Oli yang menyebutkan cara membuat file contoh. Kemudian lanjutkan dengan perintah yang saya gunakan.
Luis Alvarado
Saya berharap output dari ini saling kompatibel. misalnya keluaran dari lrzipdapat dikompresi menggunakan pbzip2, misalnya.
Vineet Menon
10

Selain ringkasan yang bagus di atas (terima kasih Luis), orang-orang hari ini mungkin juga ingin mempertimbangkan PIXZ, yang menurutnya README (Sumber: https://github.com/vasi/pixz - Saya belum memverifikasi klaim sendiri ) memiliki beberapa keunggulan dibandingkan PXZ.

[Compared to PIXZ, PXZ has these advantages and disadvantages:]

    * Simpler code
    * Uses OpenMP instead of pthreads
    * Uses streams instead of blocks, not indexable
    * Uses temp files and doesn't combine them until the whole file is compressed, high disk/memory usage

Dengan kata lain, PIXZ seharusnya lebih banyak memori dan disk efisien, dan memiliki fitur pengindeksan opsional yang mempercepat dekompresi masing-masing komponen file tar terkompresi.

nturner
sumber
Namun, menurut pemahaman saya, pixzarsip tidak kompatibel dengan xzformat standar pxz.
Mxx
5
@ MX: Format file kompatibel. pixzdapat mendekompresi xzarsip dan xzdapat mendekompresi pixzarsip. Namun, opsi baris perintah aktif xzdan pixzberbeda.
Bola Salju
File yang dapat diindeks adalah kemenangan besar bagi pixz.
ostrokach
9

Memperbarui:

XZ Utils mendukung kompresi multi-berulir sejak v5.2.0, awalnya didokumentasikan secara salah sebagai dekompresi multi-berulir.

Sebagai contoh: tar -cf - source | xz --threads=0 > destination.tar.xz

donbradken
sumber
Anda juga dapat menjalankan export XZ_DEFAULTS="-T 0" dan kemudian hanya menggunakan panggilan tar biasa, yaitu tar cJf target.tar.xz source.
scai
4

lzop juga bisa menjadi opsi yang layak, meskipun ini single-threaded.

Ini menggunakan algoritma kompresi lempel-ziv-oberhumer yang sangat cepat yang 5-6 kali lebih cepat daripada gzip dalam pengamatan saya.

Catatan: Meskipun belum multi-threaded, itu mungkin akan mengungguli pigz pada 1-4 sistem inti. Itu sebabnya saya memutuskan untuk memposting ini bahkan jika itu tidak langsung menjawab pertanyaan Anda. Cobalah, ini dapat memecahkan masalah kemacetan CPU Anda saat menggunakan hanya satu CPU dan mengompresi sedikit lebih buruk. Saya menemukan itu sering menjadi solusi yang lebih baik daripada, misalnya pigz.

ce4
sumber
Bukankah itu lebih baik dalam dekompresi? Mengompresi membutuhkan waktu yang sama (atau lebih buruk) daripada gzip
Lennart Rolland
Saya juga bisa bersaksi bahwa lzop sangat cepat. Proxmox menggunakan lzop untuk cadangan mesin virtual secara default.
Lonnie Best
1
lz4 bahkan lebih cepat (dan memiliki versi multi-utas).
David Balažic
3

Kompresor LZMA2 dari p7zip Instal p7zip menggunakan kedua core pada sistem saya.

David Foerster
sumber
3

Ini sebenarnya bukan jawaban, tapi saya pikir itu cukup relevan untuk berbagi tolok ukur saya membandingkan kecepatan gzipdan pigzpada HW nyata dalam skenario kehidupan nyata. Seperti pigzevolusi multithreaded saya pribadi telah memilih untuk digunakan mulai sekarang.

Metadata:

  • Perangkat keras yang digunakan: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz(4c / 8t) + Nvme SSD
  • Distribusi GNU / Linux: Xubuntu 17.10 (artful)
  • gzip versi: 1.6
  • pigz versi: 2.4
  • File yang dikompres adalah 9,25 GiB SQL dump

gzip cepat

time gzip -1kN ./db_dump.sql

real    1m22,271s
user    1m17,738s
sys     0m3,330s

gzip terbaik

time gzip -9kN ./db_dump.sql 

real    10m6,709s
user    10m2,710s
sys     0m3,828s

pigz cepat

time pigz -1kMN ./db_dump.sql 

real    0m26,610s
user    1m55,389s
sys     0m6,175s

pigzterbaik (tidak zopfli)

time pigz -9kMN ./db_dump.sql 

real    1m54,383s
user    14m30,435s
sys     0m5,562s

pigz+ zopflialgoritma

time pigz -11kMN ./db_dump.sql 

real    171m33,501s
user    1321m36,144s
sys     0m29,780s

Sebagai bottomline saya tidak akan merekomendasikan zopflialgoritma karena kompresi membutuhkan banyak waktu untuk jumlah ruang disk yang tidak terlalu signifikan.

Ukuran file yang dihasilkan:

  • s terbaik : 1309M
  • cepat s: 1680M
  • zopfli : 1180M
helvete
sumber
2

Zstandard mendukung multi-threading sejak v1.2.0 ¹. Ini adalah kompresor dan dekompresor yang sangat cepat yang dimaksudkan untuk mengganti gzip dan juga dapat mengompres dengan efisien - jika tidak lebih baik - seperti LZMA2 / XZ pada level tertinggi.

Anda harus menggunakan artful atau rilis yang lebih baru, atau kompilasi versi terbaru dari sumber untuk mendapatkan manfaat ini. Untungnya itu tidak menarik banyak ketergantungan.

  1. Ada juga pzstd pihak ke-3 di v1.1.0 dari zstd.
LiveWireBT
sumber