![并行焦化](https://linux22.com/image/69367/%E5%B9%B6%E8%A1%8C%E7%84%A6%E5%8C%96.png)
一位海洋学家朋友在工作中需要备份数月的数据。她不知所措,所以我自愿这样做。有数百个目录需要备份,我们希望将它们 tar/bzip 到与目录同名的文件中。我可以很容易地连续完成此操作 - 但是 - 我想利用我的工作站上的数百个核心。
问题:使用 find 和-n
-P
args 或 GNU Parallel,如何 tar/bzip 目录,在命名最终产品时使用尽可能多的内核: origonalDirName.tar.bz2
?
我使用 find 同时打包 100 个文件,速度非常快 - 所以这是解决问题的方法,尽管我不知道如何使每个文件名成为每个目录的文件名。
答案1
只需tar
将stdout
其传送到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 接受多个选项,允许调整处理器数量、使用的内存量、压缩级别等。
或者每个目录一个存档(假设目录名称中没有空格或特殊字符):
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 表达式。它删除了结局/