并行焦化

并行焦化

一位海洋学家朋友在工作中需要备份数月的数据。她不知所措,所以我自愿这样做。有数百个目录需要备份,我们希望将它们 tar/bzip 到与目录同名的文件中。我可以很容易地连续完成此操作 - 但是 - 我想利用我的工作站上的数百个核心。

问题:使用 find 和-n -Pargs 或 GNU Parallel,如何 tar/bzip 目录,在命名最终产品时使用尽可能多的内核: origonalDirName.tar.bz2

我使用 find 同时打包 100 个文件,速度非常快 - 所以这是解决问题的方法,尽管我不知道如何使每个文件名成为每个目录的文件名。

答案1

只需tarstdout其传送到pigz. (您很可能不想并行化磁盘访问,而只想并行化压缩部分。):

$ tar -c myDirectory/ | pigz > myDirectory.tar.gz

像上面这样的简单tar调用基本上只以可逆的方式连接目录树。压缩部分可以像本示例中那样是分离的。

pigz进行多线程压缩。它使用的线程数可以调整-p,并且默认为可用核心数。更详细的信息可以在Pigz github 仓库

答案2

pbzip2 工作得很好。与上面的答案一样,tar 到 stdout 并通过管道传输到 pbzip2:

$ tar -cf - mydir/ | pbzip2 > mydir.tar.bz2

pbzip2 接受多个选项,允许调整处理器数量、使用的内存量、压缩级别等。

http://compression.ca/pbzip2/

或者每个目录一个存档(假设目录名称中没有空格或特殊字符):

for dir in * ; do 
     [[ ! -d ${dir} ]] && continue
     tar cf -  ${dir} | bzip2 > ${dir}.tar.bz2 &
done

答案3

使用 GNU Parallel 时,它看起来像这样:

parallel tar jcvf /tmp/{= s:/$:: =}.tar.bz2 {} ::: */

或者:

parallel tar jcvf /tmp/{}.tar.bz2 {} ::: *

为了获得更好的压缩效果,请尝试:

parallel tar -I pxz -cvf /tmp/{= s:/$:: =}.tar.xz {} ::: */

s:/$::是一个 Perl 表达式。它删除了结局/

相关内容