7za 中的多线程支持

Bri*_*n L 23 linux compression 7-zip

(我首先在 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
Run Code Online (Sandbox Code Playgroud)

这失败并出现错误:

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
Run Code Online (Sandbox Code Playgroud)

Den*_*nis 28

根据-m (Set compression Method) switch # ZipMultiThread - 7ZIP manual & documentationmt默认为on,因此根本不需要指定它。

但是,7zip 的 DEFLATE 算法实现不支持多线程!

正如你已经发现的那样,

7za a archive.zip bigfile
Run Code Online (Sandbox Code Playgroud)

只使用一个核心。

但是.zip文件单独压缩每个文件。压缩多个文件时,多线程选项一次压缩每个内核一个文件。

试试看,你会看到

7za a archive.zip bigfile1 ... bigfileN
Run Code Online (Sandbox Code Playgroud)

将使用所有可用的N内核。

如果要加快单个文件的压缩速度,有两种选择:

  1. 分成bigfile几块。

  2. 使用不同的压缩算法。

    例如,7zip 对 BZip2 算法的实现支持多线程。

    语法是:

    7za a -mm=BZip2 archive.zip bigfile
    
    Run Code Online (Sandbox Code Playgroud)

此外,语法错误是由您尝试对.zip容器使用 LZM 算法引起的。那是不可能的。

.zip容器的可能算法是 DEFLATE(64)、BZip2 和无压缩。

如果要使用 LZM 算法,请使用.7z容器。此容器还处理以下算法:PPMd、BZip2、DEFLATE、BCJ、BCJ2 和无压缩。

  • @BrianL 内置了一个“感谢”按钮。它看起来像一个向上的箭头;) (3认同)

小智 6

这是一个老问题,不是具体问题的答案,而是对问题精神的回答(Using all cores to compress a zip format)

pigz(带有 .zip 选项的并行 gzip)

pigz -K -k archive.zip bigfile txt
Run Code Online (Sandbox Code Playgroud)

对于相同的压缩级别,这将为您提供 7 倍的 zip 兼容文件。

使用单核和多核的 zip 兼容压缩器和非 zip 压缩器的快速比较。

i7-2600k 上的 wall time 在 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)
Run Code Online (Sandbox Code Playgroud)

墙壁时间来解压

4.2s unzip -t
2.0s pigz -t
5.1s bsc d
0.5s zhuff -d
Run Code Online (Sandbox Code Playgroud)