xz 多线程压缩支持详解

倖福魔咒の 提交于 2020-03-02 15:31:38

XZ多线程压缩支持详解

xz的旧版不支持多线程压缩。需要下载编译新版的xz(支持 -T参数的版本)我这里是 5.2.4
使用xz进行压缩:
xz -9 -k -z release.tar
使用xz进行多线程压缩:
xz -9 -T 12 -k -z release.tar
但是使用时你会发现,很多时候使用-T参数不能全核编译,我在一台6核12线程的机器上,压缩一个1.2G的文件。使用-T -9 也就是采用最高压缩率的时候,CPU的最高占用率只能达到600%,使用-T -6的时候,才可以用到全部的12核编译。

造成这个问题的原因,和xz多线程压缩的原理有关。
多线程压缩的时候,xz会将待压缩的文件分成几个部分,每一个线程压缩一个部分。

默认情况下,分块的大小是LZMA2文件夹的三倍。使用-6,目录大小为8Mib,并且块大小24 MiB。
而对于-9,它们是64 MiB和192 MiB。

所以如果输入文件不够大,就无法使用所有CPU核心。

当然,块大小可以使用--block size=size选项进行调整。

减小块大小往往会降低压缩率,并且会对内存造成很大的占用。以换取压缩速率上的提升。

需要注意的是,设置分割块的大小,不能小于LZMA2文件夹的大小。所以使用-9时,块大小的设置也不能低于64Mib。

更改块大小影响压缩时候的RAM使用,如果设置不合理很可能内存会爆掉,可以在使用xz命令的时候加一个-vv(即verbose两次)看到需要多少内存占用。还可以查看到压缩进度,剩余时间等信息:
可以看到使用-T12时,需要至少14G的内存
为了提高效率,如果你明确知道输入文件大小时,可以手动调整块大小:n*max_number_of_threads*block_size=input_file_size
尝试使用n=1可能会提供最好的压缩速率,但是大文件的时候RAM的使用可能会非常大,并且压缩率可能也不太好因为不同的块可能需要不同的压缩时间

比如:

  • 1200 MiB的文件:对于12个线程,这不是一个大文件,因此如果使用-9.最好分成12块:xz -T12 -9 --block-size=100MiB
  • 12 GiB(12288 MiB)大小的文件:仅拆分为12个块就比较拉胯了,因为“xz-T12-9”将使用44G的内存。将块大小改为256M,则需要48个分块, 4 * 12 ,每个线程需要编译四个分块耗费内存则只需要17G,这样的块大小更合理一些
    xz -T12 -9 --block-size=256MiB -vv
    或者设置成128 MiB,需要96=8*12个块,将RAM使用率降低到12 GiB
    (但请注意,压缩比也会受到一些影响):
    xz -T12 -9 --block-size=128MiB -vv
  • 300 MiB大小的文件的话:这对于-9的12个线程来说太小了。不得不在使用更少的线程,或者接受更差的压缩率之间做出选择。

使用--memlimit-compress可以有效地避免压缩过程中内存被爆掉的情况,比如把下面这一行内容加到~/.bashrc中:
export XZ_DEFAULTS=--memlimit-compress=12GiB
它只会对xz工具生效

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!