问题描述
什么compression tools可用于Ubuntu,可以从multi-core CPU中受益。
最佳解决思路
有两个主要工具。 lbzip2
和pbzip2
。它们实际上是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
似乎是随机数据的赢家。它的压缩程度略低,但要快得多。因人而异。
次佳解决思路
好吧,关键字是并行的。在查找了所有并行的压缩工具之后,我发现了以下内容:
PXZ – Parallel XZ是一种压缩实用程序,它可以同时在多个内核和处理器上运行输入文件的不同部分的LZMA压缩。其主要目标是利用所有资源来加速压缩时间,同时尽可能减小对压缩比的影响。
sudo apt-get install pxz
PLZIP – Lzip是一种基于LZMA算法的无损数据压缩器,具有非常安全的完整性检查和类似于gzip或bzip2的用户界面。 Lzip的解压缩速度几乎和gzip一样快,并且比bzip2压缩得更好,这使得它非常适合软件分发和数据存档。
Plzip是使用lzip文件格式的lzip的大规模并行(multi-threaded)版本; plzip生成的文件与lzip完全兼容。
Plzip旨在更快地压缩/解压缩多处理器计算机上的大文件,这使其特别适合分发大型软件文件和大规模数据存档。在足够大的文件上,plzip可以使用数百个处理器。
sudo apt-get install plzip
PIGZ-pigz代表GZip的并行实现,是gzip的全功能替代品,在压缩数据时利用多个处理器和多个内核。
sudo apt-get install pigz
PBZIP2 – pbzip2是bzip2 block-sorting文件压缩器的并行实现,它使用pthreads并在SMP机器上实现near-linear加速。此版本的输出与bzip2 v1.0.2完全兼容(即:使用pzzip2压缩的任何内容都可以使用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%)
第三种解决思路
另外上面的好总结(感谢Luis),这些天人们可能也想考虑PIXZ,根据它的README(来源: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文件的各个组件的解压缩。
第四种思路
更新:
XZ Utils支持自v5.2.0以来的multi-threaded压缩,它最初被错误地记录为multi-threaded解压缩。
例如:tar -cf - source | xz --threads=0 > destination.tar.xz
第五种思路
lzop也可能是一个可行的选择,尽管它是single-threaded。
它使用非常快的lempel-ziv-oberhumer压缩算法,在我的观察中比gzip快5-6倍。
注意:虽然它不是multi-threaded,但它可能会在1-4核心系统上胜过pigz。这就是为什么我决定发布这个,即使它没有直接回答你的问题。尝试一下,它可以解决您的CPU瓶颈问题,同时只使用一个CPU并压缩一点点。我发现它通常比一个更好的解决方案,例如pigz。
第六种思路
p7zip的LZMA2压缩器在我的系统上使用两个核心。
第七种思路
这不是一个真正的答案,但我认为在真实生活场景中,在真实硬件上比较gzip
和pigz
的速度是否足够相关。由于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
算法,因为压缩需要花费大量时间才能使not-that-significant磁盘空间不受限制。
产生的文件大小:
-
最佳:1309M
-
速度:1680M
-
zopfli:1180M