7za 中的多線程支持

7za 中的多線程支持

(我首先將其發佈在 serverfault 上,但後來我意識到它可能屬於這裡。)

我正在嘗試使用 7za (p7zip) 9.20 壓縮一個非常大的文字檔案。 -mmt 選項似乎沒有任何效果。我嘗試過 -mmt=on 和 -mmt=2。這是一台8核心機。有人建議加入 -m0=lzma2 作為參數,但這只會給我 E_INVALIDARG。有人知道如何進行這項工作嗎?

這沒有效果:

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

這會失敗並出現錯誤:

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

答案1

根據-m(設定壓縮方法)開關 # ZipMultiThread - 7ZIP 手冊和文檔mt預設為on,因此根本不需要指定它。

然而,7zip 的 DEFLATE 演算法的實作不支援多執行緒!

正如您已經發現的那樣,

7za a archive.zip bigfile

僅使用一個核心。

.zip檔案會單獨壓縮每個檔案。壓縮時一些檔案時,多執行緒選項會為每個核心一次壓縮一個檔案。

試試你就會發現

7za a archive.zip bigfile1 ... bigfileN

將使用所有可用的N核心。

如果你想加快壓縮速度單身的文件,你有兩個選擇:

  1. 分成bigfile大塊。

  2. 使用不同的壓縮演算法。

    例如,7zip 對 BZip2 演算法的實作支援多執行緒。

    語法是:

    7za a -mm=BZip2 archive.zip bigfile
    

此外,語法錯誤是由於您嘗試對容器使用 LZM 演算法引起的.zip。那是不可能的。

容器的可能演算法.zip有 DEFLATE(64)、BZip2 和無壓縮。

如果要使用LZM演算法,請使用容器.7z。容器還處理以下演算法:PPMd、BZip2、DEFLATE、BCJ、BCJ2 和無壓縮。

答案2

這是一個老問題,不是具體問題的答案,而是問題精神的答案(使用所有核心來壓縮zip格式)

Pigz(帶有 .zip 選項的並行 gzip)

pigz -K -k archive.zip bigfile txt

對於相同的壓縮級別,這將使您的 zip 相容檔案速度提高 7 倍。

使用單核心和多核心的 zip 相容壓縮器和非 zip 壓縮器的快速比較。

在 i7-2600k 上壓縮 Fedora 20 上的 1.0GB txt 檔案所需的時間

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)

減壓牆時間

4.2s unzip -t
2.0s pigz -t
5.1s bsc d
0.5s zhuff -d

答案3

在 Linux 上實現多線程壓縮的另一個選擇是使用 Facebook 使用的內容,Z標準。在 Ubuntu 上,您可以像這樣安裝它:

sudo apt install zstd

超快的多執行緒壓縮:

tar cf - /folder/you/want/to/compress | zstdmt -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst

您可以指定壓縮等級 1-19(預設為 3)。

最大壓縮(最慢):

tar cf - /folder/you/want/to/compress | zstdmt -19 -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst

中等壓縮(10 級):

tar cf - /folder/you/want/to/compress | zstdmt -10 -o /location/to/output/fileName$(date '+%Y-%m-%d_%H:%M:%S').tar.zst

我的整體經驗是,Zstandard 壓縮不如 7zip 強大,但它速度更快,而且該zstdmt命令嘗試使用所有核心。

順便說一句,在 Window 上,7zip 預設使用所有處理器,但令我非常失望的是,Linux 中並非如此。這種情況已經持續了好幾年了,我希望 7zip 在 Linux 中也預設是多執行緒的。

答案4

只需使用 -mmt[N+1]

例如:-mmt2適用於1個線程,-mmt9適用於8個線程

相關內容