Dukungan multithreaded di 7za

18

(Saya memposting ini pertama kali di serverfault, tapi kemudian saya menyadari itu mungkin milik sini.)

Saya mencoba mengompres file teks yang sangat besar menggunakan 7za (p7zip) 9.20. Opsi -mmt tampaknya tidak memiliki efek apa pun. Saya sudah mencoba keduanya -mmt = pada dan -mmt = 2. Ini adalah mesin 8-core. Satu orang menyarankan menambahkan -m0 = lzma2 sebagai argumen, tapi itu hanya memberi saya E_INVALIDARG. Adakah yang tahu cara membuat ini bekerja?

Ini tidak berpengaruh:

7za a -mx=9 -mmt=2 -p myarchive.zip bigfile.txt

Dan ini gagal dengan kesalahan:

7za a -m0=lzma2 -mx=9 -mmt=2 -p myarchive.zip bigfile.txt


7-Zip (A) [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,8 CPUs)
Scanning

Creating archive release_20120601-1-http.zip



System error:
E_INVALIDARG
Brian L
sumber
Saya percaya pilihannya sederhana -mmt, tidak -mmt=2. Saya juga percaya sintaksis yang tepat adalah -mx9, meskipun keduanya mungkin bekerja.
Terobosan
Terima kasih, tetapi -mmt tanpa opsi masih menggunakan hanya satu utas. Menurut docs.bugaco.com/7zip/MANUAL/switches/method.htm#ZipMultiThread , Anda dapat menentukan jumlah utas untuk digunakan dengan, -mmt = N.
Brian L
Saya masih merekomendasikan menggunakan LZMA / Mengempis meskipun hanya satu threaded. Meskipun Anda mungkin mendapatkan peningkatan kecepatan kompresi dengan BZip2, itu kurang efisien ketika mengompresi teks biasa, dan varian single-threaded lebih lambat daripada LZMA / Deflate yang setara.
Terobosan
@Breakthrough: BZip2 biasanya mencapai kompresi yang lebih baik daripada DEFLATE, seperti yang ditunjukkan pada tautan Anda. Ini juga jauh, jauh lebih cepat daripada LZMA (saat mengompresi).
Dennis

Jawaban:

25

Menurut beralih -m (Atur Metode kompresi) # ZipMultiThread - manual & dokumentasi 7ZIP , mtstandarnya adalah on, jadi tidak perlu menentukannya sama sekali.

Namun, implementasi algoritma DEFLATE 7zip tidak mendukung multi-threading!

Seperti yang telah Anda temukan,

7za a archive.zip bigfile

hanya menggunakan satu inti.

Tetapi .zipfile mengkompres setiap file secara individual. Saat mengompresi beberapa file, opsi multi-threading memampatkan satu file per inti sekaligus.

Cobalah dan Anda akan melihatnya

7za a archive.zip bigfile1 ... bigfileN

akan menggunakan semua Ncore yang tersedia .

Jika Anda ingin mempercepat kompresi satu file, Anda memiliki dua pilihan:

  1. Berpisah menjadi beberapa bagian bigfile.

  2. Gunakan algoritma kompresi yang berbeda.

    Sebagai contoh, implementasi 7zip pada algoritma BZip2 mendukung multi-threading.

    Sintaksnya adalah:

    7za a -mm=BZip2 archive.zip bigfile
    

Juga, kesalahan sintaksis disebabkan oleh upaya Anda untuk menggunakan Algoritma LZM untuk sebuah .zipwadah. Itu tidak mungkin.

Algoritma yang mungkin untuk .zipconatiners adalah DEFLATE (64), BZip2 dan tidak ada kompresi.

Jika Anda ingin menggunakan Algoritma LZM, gunakan .7zwadah. Wadah ini juga menangani algoritme berikut: PPMd, BZip2, DEFLATE, BCJ, BCJ2, dan tanpa kompresi.

Dennis
sumber
@ Dennis Saya pikir OP menggunakan LZMA (2), yang dari dokumentasi, "kompresi LZMA hanya menggunakan 2 utas." Meskipun saya setuju, secara intuitif (karena cara Lempel-Ziv encoding bekerja), akan sangat sulit untuk multithread LZMA atau Deflate (yang hanya LZMA dengan pengkodean Huffman).
Terobosan
1
@Breakthrough: Pada awalnya, saya juga. (Lihat revisi jawaban saya.) Itulah yang terjadi tentang kesalahan sintaksis. Anda tidak dapat menggunakan kompresi LZMA dengan sebuah .zipwadah.
Dennis
@ Dennis ah, terima kasih sudah menjelaskannya. Tidak melihat bahwa OP menggunakan .ZIPwadah.
Terobosan
Tunggu, jadi saya akan mendapatkan hasil yang berbeda jika saya hanya mengubah ekstensi file kontainer menjadi .7z?
Brian L
3
@BrianL ada tombol "terima kasih" di dalamnya. Sepertinya panah menghadap ke atas;)
nhinkle
5

Ini adalah pertanyaan lama, dan bukan jawaban untuk pertanyaan spesifik, tetapi jawaban untuk semangat pertanyaan (Menggunakan semua core untuk mengompres format zip)

pigz (gzip paralel dengan opsi .zip)

pigz -K -k archive.zip bigfile txt

Ini akan memberi Anda file yang kompatibel dengan zip 7x lebih cepat untuk level kompresi yang sama.

Komparasi cepat dari kompres zip yang kompatibel dan non-zip menggunakan inti tunggal dan ganda.

waktu dinding pada i7-2600k untuk mengkompres file txt 1.0gb pada fedora 20

67s (120mb) 7za (zip,1 thread)
15s (141mb) 7za -mx=4 (zip,1 thread)
17s (132mb) zip (zip,1 thread)
 5s (131mb) pigz -K -k (zip,8 threads)
 9s (106mb) bsc (libbsc.com) (not zip,8 threads)
 5s (130mb) zhuff -c2 (not zip,8 threads)
 2s (149mb) zhuff (not zip,8 threads)

waktu dinding untuk dekompresi

4.2s unzip -t
2.0s pigz -t
5.1s bsc d
0.5s zhuff -d
tgeorge
sumber
mengapa pigz ketika Anda bisa pbzip2 atau pixz?
angguk
gzip jauh, jauh lebih cepat daripada bzip2, jadi kompresi ekstra tidak selalu sepadan.
jesjimher
0

Cukup gunakan -mmt [N + 1]

Sebagai contoh: -mmt2 untuk satu utas, -mmt9 untuk delapan utas

acubed
sumber
-1

Diverifikasi dan diuji: Untuk menggunakan multithreading pada 7za parameternya harus "-mmt #" bukan "-mmt = #", menempatkan tanda sama dengan membuatnya diabaikan.

Bagaimana saya menemukan? Setelah saya menjalankan 7z tanpa parameter apa pun itu menunjukkan info tentang parameter, pada sakelar itu tertulis "-mmt [N]", bukan "-mmt = [N]"

Jadi jika saya mengerti dengan baik, parameter yang Anda ketikkan "-mmt = 2" mungkin salah tulis dan mungkin "-mmt2", tanpa tanda sama dengan.

Tidak yakin jika saya mengerti dengan baik, bahasa Inggris saya sangat buruk.

Omong-omong, mengapa Anda menggunakan "7za" bukan hanya "7z"?

Jadi untuk menguji parameter saya menjalankan seperangkat perintah untuk melakukan benchmark dan itu mengkonfirmasi kesalahan ketik pada beberapa dokumentasi. Parameter yang benar harus diketik tanpa tanda sama dengan.

Perintah untuk melakukan benchmark dengan 7z dengan hanya satu utas: 7z b -mmt1

Perintah untuk melakukan benchmark dengan 7z dengan hanya dua utas: 7z b -mmt2

Perintah untuk melakukan benchmark dengan 7za hanya dengan dua utas: 7za b -mmt2

Perintah untuk melakukan benchmark dengan 7za hanya dengan satu utas: 7za b -mmt1

Tidak ada tanda sama pada parameter ˋ-mmt # ˋ, baik untuk 7z, maupun 7za.

Laura
sumber