有效地将gzip文件转换为bzip2


10

我有一堆gzip文件,我必须不时将其转换为bzip2。当前,我正在使用一个shell脚本,该脚本只是简单地对每个文件进行“ gunzip”,然后对它进行“ bzip2”。尽管此方法可行,但仍需要大量时间才能完成。

是否可以使此过程更有效?我准备下潜,并在必要时查看gunzip和bzip2的源代码,但我只是想确保获得回报。是否有提高流程效率的希望?

Answers:


1

很久以前,当pbzip2不可用或无法从stdin进行压缩时,就问了这个问题,但是现在您可以使用parallelpbzip2(而不是bzip2并行化解压缩步骤和压缩步骤:

ls *.gz | parallel "gunzip -c {} | pbzip2 -c > {.}.bz2"

这比使用bzip2快得多。


嗨,我已经更改了对此问题的公认答案,因为这为今天陷入困境的人们提供了最佳选择。感谢您的pbzip2提及。万一链接没有为其他人加载,这是项目页面手册页
sundar-恢复莫妮卡

15

我不知道在一个步骤中使用gunzip并在另一步骤中使用bzip2,我想知道使用管道是否会更有效。就像是gunzip --to-stdout foo.gz | bzip2 > foo.bz2

我在考虑使用两个或多个CPU,这肯定会更快。但也许甚至只有一个核心。我可耻地承认没有尝试过。


2
+1用于管道传输,磁盘I / O是您要避免的事情。至于压缩,除非我误会,否则bzip2不是并行的。您必须使用pbzip2之类的文件并行压缩
gustafc,2009年

...而且不幸的是,似乎没有任何可用的parallell gzip解压缩实用程序。
gustafc

@gustafc:感谢您提供的指向pbzip2的链接,这非常有帮助... @OP:我避免使用管道bcos,我希望能够处理损坏的gz文件等,而又不会在管道中丢失它们...
sundar-恢复莫妮卡

4
@gustafc:即使bzip2gzip并行做内部不工作,通过管道,你可以在他们并行工作,因为管道隐式启动两个进程,这并行运行。因此,至少解压缩和压缩将并行进行。
sleske 2011年

1
@sleske,即使您在理论上是正确的,但它bzip2的CPU使用率也使它相形见so,gunzip因此在实践中,您获得的并行度很小。不必做磁盘IO仍然很好!
约翰·沃尔斯

6

如果您有多个内核(甚至多个机器),则可以选择使用GNU并行(http://www.gnu.org/software/parallel):

ls *.gz | parallel "gunzip -c {} | bzip2 > {.}.bz2"

阅读教程/手册页以获取详细信息和选项。


3

您目前正在做的是最好的选择。没有可用的转换工具,并且尝试bzip2已经压缩的文件并不是真正的选择,因为它经常会产生不良影响。由于算法不同,因此转换将涉及检索原始数据。除非gzipping当然是bzip2流程中的一步,否则不幸的是。


算法是否没有任何重叠的步骤,这样我可以在gzip解压缩中跳过一个步骤,而在bzip压缩中也跳过相同的步骤?
sundar-恢复莫妮卡

2
@sundar我不这么认为。gzip使用Leimpel-Ziv 77,而bzip2使用Burrows-Wheeler。恐怕会有不同的算法。
2011年

2

有时,我需要对日志文件执行相同的操作。我先从最小的* .gz文件开始(ls -rS),先进行gunzip,然后分别对bzip2进行压缩。我不知道是否可以将gunzip输出直接定向到bzip2输入。bzip2命令的压缩速度比gunzip的解压缩速度慢得多,因此它可能会占用主机上的内存和交换空间。

欢迎改进或提出建议。这是我的一支班轮:

for i in $(ls -rS *.gz | sed 's/\.gz//'); do gunzip ${i}.gz; bzip2 -9 ${i}; done

感谢您的投入,关于两个进程之间的速度差异及其含义的观点很重要。
sundar-恢复莫妮卡2012年


1

几分钟前只需要这样做:

find . -name "*.gz" | perl -pi -e 's/\.gz$//g;' | xargs -n1 ./rezip

其中的rezip定义为:

#!/bin/bash
gunzip -v $1.gz && bzip2 -9v $1

您也可以-P选择使用带有选项的多线程线程xargs,但请谨慎使用。(从低开始!)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.