有效地将 gzip 文件转换为 bzip2

sun*_*ica 10 gzip conversion

我有一堆 gzip 文件,我必须时不时地将它们转换为 bzip2。目前,我正在使用一个 shell 脚本,它简单地对每个文件进行“gunzip”,然后是“bzip2”。虽然这行得通,但需要很多时间才能完成。

是否有可能使这个过程更有效?如有必要,我已准备好深入研究 gunzip 和 bzip2 的源代码,但我只想确定回报。有没有希望提高流程的效率?

Chr*_*ton 15

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

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

  • @gustafc:即使`bzip2` 和`gzip` 不在内部并行工作,通过使用管道,您可以让它们并行工作,因为管道隐式启动两个进程,这两个进程*将*并行运行。所以至少解压和压缩会并行运行。 (4认同)
  • +1 用于管道,磁盘 I/O 是您想要避免的。至于压缩,除非我弄错了,否则 bzip2 不是并行的。你必须使用类似 pbzip2 的东西来并行压缩:http://compression.ca/pbzip2/ (2认同)

小智 6

如果您有多个内核(甚至多台机器),GNU 并行 ( http://www.gnu.org/software/parallel ) 可能是一种选择:

ls *.gz | parallel "gunzip -c {} | bzip2 > {.}.bz2"
Run Code Online (Sandbox Code Playgroud)

阅读教程/手册页了解详细信息和选项。


fly*_*ger 3

很久以前就有人问过这个问题,当时pbzip2不可用或无法从标准输入进行压缩,但现在您可以使用并行pbzip2 而不是bzip2)并行化解压缩和压缩步骤:

ls *.gz | parallel "gunzip -c {} | pbzip2 -c > {.}.bz2"
Run Code Online (Sandbox Code Playgroud)

这比使用bzip2快得多。