我有一堆gzip文件,我必须不时将其转换为bzip2。当前,我正在使用一个shell脚本,该脚本只是简单地对每个文件进行“ gunzip”,然后对它进行“ bzip2”。尽管此方法可行,但仍需要大量时间才能完成。
是否可以使此过程更有效?我准备下潜,并在必要时查看gunzip和bzip2的源代码,但我只是想确保获得回报。是否有提高流程效率的希望?
我有一堆gzip文件,我必须不时将其转换为bzip2。当前,我正在使用一个shell脚本,该脚本只是简单地对每个文件进行“ gunzip”,然后对它进行“ bzip2”。尽管此方法可行,但仍需要大量时间才能完成。
是否可以使此过程更有效?我准备下潜,并在必要时查看gunzip和bzip2的源代码,但我只是想确保获得回报。是否有提高流程效率的希望?
Answers:
我不知道在一个步骤中使用gunzip并在另一步骤中使用bzip2,我想知道使用管道是否会更有效。就像是gunzip --to-stdout foo.gz | bzip2 > foo.bz2
我在考虑使用两个或多个CPU,这肯定会更快。但也许甚至只有一个核心。我可耻地承认没有尝试过。
bzip2
和gzip
并行做内部不工作,通过管道,你可以在他们并行工作,因为管道隐式启动两个进程,这将并行运行。因此,至少解压缩和压缩将并行进行。
bzip2
的CPU使用率也使它相形见so,gunzip
因此在实践中,您获得的并行度很小。不必做磁盘IO仍然很好!
如果您有多个内核(甚至多个机器),则可以选择使用GNU并行(http://www.gnu.org/software/parallel):
ls *.gz | parallel "gunzip -c {} | bzip2 > {.}.bz2"
阅读教程/手册页以获取详细信息和选项。
您目前正在做的是最好的选择。没有可用的转换工具,并且尝试bzip2已经压缩的文件并不是真正的选择,因为它经常会产生不良影响。由于算法不同,因此转换将涉及检索原始数据。除非gzipping当然是bzip2流程中的一步,否则不幸的是。
gzip
使用Leimpel-Ziv 77,而bzip2
使用Burrows-Wheeler。恐怕会有不同的算法。
有时,我需要对日志文件执行相同的操作。我先从最小的* .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
pbzip2
提及。万一链接没有为其他人加载,这是项目页面和手册页。