我发现自己不得不压缩许多非常大的文件(80-ish GB),并且我对我的系统表现出的(缺乏)速度感到惊讶。我得到大约500 MB / min的转换速度;使用top
,我似乎正在以大约100%使用单个CPU。
我非常确定这不是(只是)磁盘访问速度,因为创建tar
文件(这就是80G文件的创建方式)仅花费了几分钟(也许5或10),但是经过2个小时多之后,我仍然使用了简单的gzip命令未完成。
综上所述:
tar -cvf myStuff.tar myDir/*
用了不到5分钟的时间创建了87 G tar文件
gzip myStuff.tar
花了两个小时又十分钟,创建了一个55G的zip文件。
我的问题:这正常吗?有某些选择gzip
可以加快速度吗?串联命令并使用会更快tar -cvfz
吗?只见参考pigz
- GZip压缩的并行实现 -但不幸的是我不能安装我使用的机器上的软件,所以这不是我的选择。例如,参见前面的问题。
我打算自己尝试其中一些选项并为它们计时-但是,我很可能不会碰到选项的“魔术组合”。我希望这个网站上的某人知道加快速度的正确方法。
当我获得其他试验的结果时,我将更新此问题-但如果有人有特别好的技巧,我将非常感激。也许gzip只是花费了比我意识到更多的处理时间...
更新
按照承诺,我尝试了以下建议的技巧:更改压缩量,并更改文件的目标。对于大约4.1GB的tar,我得到以下结果:
flag user system size sameDisk
-1 189.77s 13.64s 2.786G +7.2s
-2 197.20s 12.88s 2.776G +3.4s
-3 207.03s 10.49s 2.739G +1.2s
-4 223.28s 13.73s 2.735G +0.9s
-5 237.79s 9.28s 2.704G -0.4s
-6 271.69s 14.56s 2.700G +1.4s
-7 307.70s 10.97s 2.699G +0.9s
-8 528.66s 10.51s 2.698G -6.3s
-9 722.61s 12.24s 2.698G -4.0s
所以是的,将标志从默认-6
更改为最快可以-1
使我提高30%的速度(对于我的数据)几乎不会更改zip文件的大小。无论我使用的是同一块磁盘还是另一块磁盘,本质上都没有区别(我必须多次运行才能获得任何统计意义)。
如果有人感兴趣,我将使用以下两个脚本生成这些计时基准:
#!/bin/bash
# compare compression speeds with different options
sameDisk='./'
otherDisk='/tmp/'
sourceDir='/dirToCompress'
logFile='./timerOutput'
rm $logFile
for i in {1..9}
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $sameDisk $logFile
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $otherDisk $logFile
done
第二个脚本(compressWith
):
#!/bin/bash
# use: compressWith sourceDir compressionFlag destinationDisk logFile
echo "compressing $1 to $3 with setting $2" >> $4
tar -c $1 | gzip -$2 > $3test-$2.tar.gz
需要注意的三件事:
- 使用
/usr/bin/time
而不是time
,因为的内置命令bash
比GNU命令具有更少的选项 - 我没有打扰使用该
--format
选项,尽管这样会使日志文件更易于阅读 - 我使用了脚本编写脚本,因为
time
似乎只能对管道序列中的第一个命令进行操作(因此我使它看起来像一个命令...)。
通过所有这些学习,我的结论是
- 用
-1
标志加快速度(可接受的答案) - 与从磁盘读取数据相比,花在压缩数据上的时间要多得多
- 投资更快的压缩软件(
pigz
似乎是一个不错的选择)。 - 如果您有多个文件要压缩,则可以将每个
gzip
命令放在自己的线程中,并使用更多可用的CPU(可怜的人pigz
)
感谢所有帮助我学习这一切的人!
$> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gz
将显示您的计算机压缩内容的速度。side-note2:将结果存储到另一张光盘上。
man
页面中的最后一个,我还没读完(因为它是按“单字母命令”排序的,即-#
) 。那会教我RTFM!这将是我接下来尝试的事情!
pigz
从碰巧构建它的位置编译并运行它,而无需安装它。如果没有编译器,则可以在另一台计算机上对其进行交叉编译,尽管这开始花费更多的精力,而不是值得的。(我猜这取决于您需要多大的压缩才能更快地运行。)