多核压缩工具

Lui*_*ado 68 compression multi-core

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

Lui*_*ado 77

好吧,关键字是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 - 124.8%


Oli*_*Oli 35

有两个主要工具。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
Run Code Online (Sandbox Code Playgroud)

lbzip2似乎是随机数据的赢家。它的压缩率稍低,但速度要快得多。天啊。

  • 我的意思是 [Kolmogorov 意义](https://en.wikipedia.org/wiki/Kolmogorov_complexity#Kolmogorov_randomness) 中的“随机”,字面定义为不可压缩性。没有通用的压缩基准,因为不同的算法对不同类型的数据效果更好。一个好的开始可能只是通过管道传输一些文本,例如`wget http://mattmahoney.net/dc/enwik8.zip` 从维基百科中获取 96MB(21MB 压缩)的文本。有关更全面的基准测试套件,[请参阅此处](https://quixdb.github.io/squash-benchmark/)。 (6认同)
  • 看起来 pbzip2 大小中缺少一个数字 (5认同)
  • `/dev/urandom` 不是基准压缩工具的一个很好的输入选择,因为根据定义,随机数据是不可压缩的。这部分解释了为什么在这两种情况下,输出文件都比输入文件大 ~450MiB。 (5认同)
  • 当我们判断不同压缩方法的性能时,我们真正感兴趣的是我们想要压缩的数据类型的未来示例的*预期*输出大小。如果这个数据真的是随机的,那么它不包含可供压缩利用的统计规律,所以对于*N*个随机字节的序列,我们所能希望的最好的输出长度是*N*个字节。对于某些示例,我们可能会做得更好一些,对于其他示例,我们可能会做得更糟(实际上我们几乎总是做得更糟),但 *预期* 输出长度保持不变。 (2认同)

小智 23

更新:

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`。 (2认同)

ntu*_*ner 11

除了上面的好总结(感谢 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
Run Code Online (Sandbox Code Playgroud)

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

  • @Mxx:文件格式兼容。`pixz` 可以解压缩 `xz` 档案,`xz` 可以解压缩 `pixz` 档案。但是,`xz` 和 `pixz` 上的命令行选项不同。 (5认同)

Liv*_*eBT 6

Zstandardv1.2.0开始支持多线程¹。它是一个非常快的压缩器和解压缩器,旨在取代 gzip,它也可以像 LZMA2/XZ 一样高效地(如果不是更好)压缩到最高级别。

您必须使用这些版本之一,或者从源代码编译最新版本才能获得这些好处。幸运的是,它不会引入很多依赖项。

在 zstd 的 v1.1.0 中还有一个 3rd party pzstd。


ce4*_*ce4 5

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

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

注意:虽然它还不是多线程的,但在 1-4 核系统上它的性能可能会优于 Pigz。这就是为什么我决定发布这篇文章,即使它不能直接回答你的问题。尝试一下,它可能会解决你的CPU瓶颈问题,同时只使用一个CPU并且压缩稍差一些。我发现它通常是比 Pigz 更好的解决方案。

  • [lz4](http://www.lz4.org) 甚至更快(并且具有多线程版本)。 (2认同)