7za中的多线程支持


18

(我首先在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

我相信选择的方法很简单-mmt,不是-mmt=2。我也相信正确的语法是-mx9,尽管两者都可行。
突破

谢谢,但不带选项的-mmt仍仅使用一个线程。根据docs.bugaco.com/7zip/MANUAL/switches/method.htm#ZipMultiThread,您可以指定-mmt = N使用的线程数。
布赖恩L

我仍然建议使用LZMA / Deflate,即使它只是单线程的。虽然你可能会得到用bzip2提高压缩速度,它是低效率的压缩纯文本的时候,和单线程变体比LZMA /放气等价物慢。
突破

@Breakthrough:BZip2通常比DEFLATE获得更好的压缩,如您的链接所示。它也比LZMA(压缩时)快得多。
丹尼斯

Answers:


25

根据-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
    

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

.zip配色器的可能算法是DEFLATE(64),BZip2和无压缩。

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


@Dennis我以为OP正在使用LZMA(2),它在文档中“ LZMA压缩仅使用2个线程”。尽管从直觉上我同意(由于Lempel-Ziv编码的工作方式),但是对多线程LZMA或Deflate(这只是具有Huffman编码的LZMA)将非常困难。
突破

1
@Breakthrough:起初,我也是。(查看答案的修订版。)这就是语法错误所在。您不能对.zip容器使用LZMA压缩。
丹尼斯

@丹尼斯啊,谢谢你清理了。没有看到OP正在使用.ZIP容器。
突破

等待,所以如果我只是将容器的文件扩展名更改为.7z,将会得到不同的结果?
布赖恩L

3
@BrianL内置了一个“谢谢”按钮。它看起来像一个朝上的箭头;)
nhinkle 2012年

5

这是一个古老的问题,不是对特定问题的答案,而是对问题实质的回答(使用所有内核压缩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

为什么可以选择pbzip2或pixz?
2014年

gzip比bzip2快得多,因此额外的压缩并不总是值得的。
jesjimher

0

只需使用-mmt [N + 1]

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


-1

经过验证和测试:要在7za上使用多线程,该参数必须为“ -mmt#”而不是“ -mmt =#”,加上等号使其被忽略。

我是怎么发现的?在我没有任何参数的情况下运行7z之后,它会显示有关参数的信息,在开关上说“ -mmt [N]”,而不是“ -mmt = [N]”

因此,如果我理解得很好,您键入的参数“ -mmt = 2”可能会写错并且可能是“ -mmt2”,而没有等号。

不知道我是否理解得很好,我的英语真的很差。

顺便说一句,为什么要使用“ 7za”而不是“ 7z”?

因此,为了测试该参数,我运行了一组命令以进行基准测试,并确认了一些文档中的拼写错误。正确的参数必须键入不带等号。

使用7z仅使用一个线程进行基准测试的命令:7z b -mmt1

使用7z仅使用两个线程进行基准测试的命令:7z b -mmt2

使用仅两个线程的7za做基准测试的命令:7za b -mmt2

使用7za仅使用一个线程进行基准测试的命令:7za b -mmt1

参数ˋ-mmt#ˋ上没有等号,既不是7z也不是7za。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.