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两次)看到需要多少内存占用。还可以查看到压缩进度,剩余时间等信息:
为了提高效率,如果你明确知道输入文件大小时,可以手动调整块大小: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工具生效
来源:CSDN
作者:三级狗
链接:https://blog.csdn.net/Three_dog/article/details/104607208