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

在同样的压缩级别下,这将为您提供 7 倍更快的 zip 兼容文件压缩效果。

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

在 Fedora 20 上,使用 i7-2600k 压缩 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 所使用的方法,标准. 在 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会尝试使用所有核心。

顺便说一句,在 Windows 上,7zip 默认使用所有处理器,而 Linux 上却不是这样,这让我很失望。这种情况已经持续了好几年,我希望 7zip 在 Linux 上也默认使用多线程。

答案4

只需使用 -mmt[N+1]

例如:-mmt2用于一个线程,-mmt9用于八个线程

相关内容