多核压缩工具


61

Ubuntu中有哪些压缩工具可以受益于多核CPU。


仅出于记录目的,一种替代方法可能是并行创建独立的存档。因此,您无需并行创建myfiles.8core.xz,而是将myfiles1.xz创建为myfiles8.xz。这将需要调度代理。两种方法都有优点和缺点。
Acumenus 2014年

2
试图使用bzip2解压缩7GB文件,只是发现它没有使用我的所有8核。阅读有关它的内容,并决定尝试pbzip2。仍仅在一个内核上运行。然后我注意到有评论说pbzip2只能完全并行化其自身压缩的文件的解压缩。相同的评论表明lbzip2可以在任何bz2文件上完全并行,这的确是事实-几乎全部使用了我的所有内核(占CPU的80-90%),并且解压缩的速度更快。
Edi Bice 2014年

Answers:


34

有两个主要工具。lbzip2pbzip2。它们本质上是bzip2压缩器的不同实现。我已经比较了它们(输出是经过整理的版本,但是您应该能够运行命令)

cd /dev/shm  # we do all of this in RAM!
dd if=/dev/urandom of=bigfile bs=1024 count=102400

$ lbzip2 -zk bigfile 
Time: 0m3.596s
Size: 105335428 

$ pbzip2 -zk bigfile
Time: 0m5.738s6
Size: 10532460

lbzip2似乎是随机数据的赢家。它的压缩量略少,但速度更快。YMMV。


5
看起来pbzip2大小缺少数字
Wayne Walker

4
/dev/urandom基准测试压缩工具不是很好的输入选择,因为根据定义,随机数据是不可压缩的。这部分解释了为什么在两种情况下输出文件都比输入 450MiB 。
ali_m

1
抱歉,我真的很痴迷,但真正的随机数据可以超级压缩。您可以要求32位的完美RNG并获得00000000000000000000000000000000。那就是随机的工作原理;)您在说的是实际平均值。您不太可能生成仅为零的100MB文件。我同意您所说的精神,我只是不同意“按定义”,因为这不是定义(因为它不准确)。
奥利(Oli)

2
当我们判断不同压缩方法的性能时,我们真正感兴趣的是将来要压缩的数据类型示例的预期输出大小。如果此数据是真正的随机数据,则它不包含用于压缩的统计规律,因此对于N个随机字节的序列,我们所希望的最佳结果是预期的N字节输出长度。对于某些示例,我们可能会做得更好,对于其他示例,我们可能会做得更糟(实际上,我们几乎总是做得更糟),但是预期的输出长度保持不变。
ali_m

5
我的意思是Kolmogorov意义上的 “随机性” ,其字面上定义为不可压缩性。没有统一的压缩基准,因为不同的算法可以更好地处理不同类型的数据。一个好的开始可能只是通过管道输入一些文本,例如wget http://mattmahoney.net/dc/enwik8.zip,从Wikipedia中获取96MB(压缩的21MB)文本。有关更全面的基准套件,请参见此处
ali_m

72

好吧,关键字是parallel。在寻找所有并行的压缩工具之后,我发现了以下内容:

PXZ -Parallel XZ是一种压缩实用程序,它可以同时在多个内核和处理器上对输入文件的不同部分运行LZMA压缩。其主要目标是利用所有资源来加快压缩时间,同时对压缩率的影响最小。

sudo apt-get install pxz

PLZIP -Lzip是基于LZMA算法的无损数据压缩器,具有非常安全的完整性检查和类似于gzip或bzip2的用户界面。Lzip的解压缩速度几乎与gzip一样快,并且压缩效果优于bzip2,这使其非常适合软件分发和数据归档。

Plzip是使用lzip文件格式的lzip的大规模并行(多线程)版本。plzip生成的文件与lzip完全兼容。

Plzip旨在在多处理器计算机上更快地压缩/解压缩大文件,这使其特别适合于分发大软件文件和大规模数据归档。在足够大的文件上,plzip可以使用数百个处理器。

sudo apt-get install plzip

PIGZ - Pigz代表GZip的并行实现,是gzip的全功能替代品,在压缩数据时利用了多个处理器和多个内核。

sudo apt-get install pigz

PBZIP2 -pbzip2是bzip2块排序文件压缩器的并行实现,该压缩器使用pthreads并在SMP机器上实现了近乎线性的加速。该版本的输出与bzip2 v1.0.2完全兼容(即:任何用pbzip2压缩的内容都可以用bzip2解压缩)。

sudo apt-get install pbzip2

LRZIP-多线程压缩程序,与大文件一起使用时,可以实现很高的压缩率和速度。它使用zpaq和lzma的组合压缩算法来实现最大压缩,使用lzo来实现最大速度,并降低rzip的远程冗余。它旨在随着RAM大小的增加而扩展,从而进一步提高压缩率。大小或速度优化的选择都可以提供比lzma所能提供的更好的压缩效果,或者比gzip更好的速度,但是具有bzip2大小的压缩级别。

sudo apt-get install lrzip

一个小的压缩基准(使用创建的Oli测试):

原始文件大小-100 MB
PBZIP2-101 MB(大1%)
PXZ-101 MB(大1%)
PLZIP-102 MB(大1%)
LRZIP-101 MB(大1%)
PIGZ-101 MB(大1%) )

一个小的压缩基准(使用文本文件):

原始文件大小-70 KB文本文件
PBZIP2-16.1 KB(23%)
PXZ-15.4 KB(22%)
PLZIP-15.5 KB(22.1%)
LRZIP-15.3 KB(21.8%)
PIGZ-17.4 KB(24.8%)


例子会很棒。
EarthmeL14年

@earthmeLon阅读Oli的答案,其中提到了如何创建示例文件。然后继续执行我使用的命令。
Luis Alvarado 2014年

我希望这些输出是相互兼容的。例如,的输出lrzip可以使用进行解压缩pbzip2
Vineet Menon

10

除了上面的不错的总结(感谢Luis),这些天来人们可能还想考虑PIXZ,根据它的自述文件(来源:https//github.com/vasi/pixz-我尚未亲自验证这些说法) )比PXZ有一些优势。

[Compared to PIXZ, PXZ has these advantages and disadvantages:]

    * Simpler code
    * Uses OpenMP instead of pthreads
    * Uses streams instead of blocks, not indexable
    * Uses temp files and doesn't combine them until the whole file is compressed, high disk/memory usage

换句话说,PIXZ应该具有更高的内存和磁盘效率,并且具有可选的索引功能,该功能可加快压缩tar文件各个组件的解压缩速度。


但是,据我了解,pixz存档与标准xz格式不兼容,实际上是这样pxz
Mxx 2014年

5
@Mxx:文件格式兼容。pixz可以解压缩xz档案,xz也可以解压缩pixz档案。但是,命令行选项on xzpixz有所不同。
雪球2014年

可索引文件是的一大胜利pixz
ostrokach '16

8

更新:

XZ Utils从v5.2.0开始支持多线程压缩,最初被错误地记录为多线程解压缩。

例如: tar -cf - source | xz --threads=0 > destination.tar.xz


您也可以运行export XZ_DEFAULTS="-T 0" ,然后仅使用通常的tar调用,即tar cJf target.tar.xz source
scai

4

尽管lzop是单线程的,但它也是可行的选择。

它使用非常快的lempel-ziv-oberhumer压缩算法,在我的观察中,它比gzip快5-6倍。

注意:尽管它还不是多线程的,但在1-4核心系统上,它的性能可能会胜过Pigz。这就是为什么即使它没有直接回答您的问题,我也决定发布此消息。尝试一下,它可能会解决您的CPU瓶颈问题,而仅使用一个CPU并压缩得更糟。我发现它通常是比Pigz更好的解决方案。


它不只是解压缩更好吗?压缩所需的时间与gzip大约相同(或更糟)
Lennart Rolland 2014年

我还可以证明lzop超级快。Proxmox默认使用lzop备份虚拟机。
Lonnie Best

1
lz4甚至更快(并具有多线程版本)。
DavidBalažic'16


3

这是不是一个真正的答案,但我认为这是足够的相关分享我的基准比较速度gzippigz在真实硬件在真实的生活场景。由于pigz是我个人选择了从现在开始使用多线程的演变。

元数据:

  • 使用的硬件:Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz(4c / 8t)+ NVMe SSD
  • GNU / Linux发行版: Xubuntu 17.10 (artful)
  • gzip 版: 1.6
  • pigz 版: 2.4
  • 被压缩的文件是9.25 GiB SQL转储

gzip

time gzip -1kN ./db_dump.sql

real    1m22,271s
user    1m17,738s
sys     0m3,330s

gzip 最好

time gzip -9kN ./db_dump.sql 

real    10m6,709s
user    10m2,710s
sys     0m3,828s

pigz

time pigz -1kMN ./db_dump.sql 

real    0m26,610s
user    1m55,389s
sys     0m6,175s

pigz最佳(否zopfli

time pigz -9kMN ./db_dump.sql 

real    1m54,383s
user    14m30,435s
sys     0m5,562s

pigz+ zopfli算法

time pigz -11kMN ./db_dump.sql 

real    171m33,501s
user    1321m36,144s
sys     0m29,780s

作为底线,我不建议使用该zopfli算法,因为压缩花费了大量时间来占用不那么多的磁盘空间。

产生的文件大小:

  • 最佳 S:1309M
  • 快速秒:1680M
  • zopfli:1180M

2

Zstandard支持,因为多线程V1.2.0 ¹。它是一种非常快的压缩器和解压缩器,旨在替代gzip,并且即使在最高水平上也可以像LZMA2 / XZ一样高效(甚至更好)进行压缩。

您必须使用巧妙的版本或较新的版本,或者从源代码中编译最新版本才能获得这些好处。幸运的是,它并没有引入很多依赖关系。

  1. 在zstd的v1.1.0中还存在一个第三方pzstd。
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.