【发布时间】:2016-11-05 19:59:11
【问题描述】:
文件位于:“Unexpected Efficiency Dept.”
前 9000 万个数字占用大约 761MB,输出如下:
seq 90000000
根据man parallel,它可以加速gzip的归档大文件,方法是把输入切碎,并使用不同的CPU来压缩块。因此,即使gzip 是单线程,这种技术也使其多线程:
seq 90000000 | parallel --pipe --recend '' -k gzip -9 >bigfile.gz
在 Intel Core i3-2330M (4) @ 2.2GHz 上耗时 46 秒。
将它传递给普通的gzip:
seq 90000000 | gzip -9 > bigfile2.gz
在同一个 CPU 上耗时 80 秒。现在是惊喜:
ls -log bigfile*.gz
输出:
-rw-rw-r-- 1 200016306 Jul 3 17:27 bigfile.gz
-rw-rw-r-- 1 200381681 Jul 3 17:30 bigfile2.gz
300K 更大?那看起来不太对劲。首先,我检查了zdiff 文件是否具有相同的内容——是的,相同。我本以为 any 压缩器在处理连续数据流时会比使用分块压缩器做得更好。为什么bigfile2.gz 不小于bigfile.gz?
【问题讨论】:
-
有趣的是,在我的 iMac 上,
bigfile2.gz变小了,并行调用和标准调用所用的时间几乎相同。 -
@MarkSetchell 出于某种原因,Mac OS X
seq不会产生相同的输出。你可以试试jot。 -
可能需要注意的是,
pigz比parallel+gzip更小更快(此处为 198345773,来自gzip的 200381681,以及 52s 用户和 6½s 真实,反对36½s 用户和真实)。 -
parallel --pipe效率低下。如果可能,请使用parallel --pipepart(在这种情况下不是这样,因为您从管道读取,但您有一个文件,--pipepart 会更快)。
标签: linux shell gzip gnu-parallel chunking