【问题标题】:Parallel tar with split for large folders用于大型文件夹的带有拆分的并行 tar
【发布时间】:2013-09-01 20:09:13
【问题描述】:

我有一个非常大的文件夹,我想 gzip 并将它们拆分为存档:

#!/bin/bash
dir=$1
name=$2
size=32000m
tar -czf /dev/stdout ${dir} | split -a 5  -d -b $size - ${name}

有没有办法通过 gnu 并行来加快速度? 谢谢。

【问题讨论】:

  • I/O 通常不可并行化。
  • 尝试使用 7-zip 代替其选项 -mmt。
  • 我使用的是 Lustre 并行文件系统,IO 不是问题。
  • @Arman 输出仍然必须按顺序排列,因此即使您划分任务,压缩块仍必须对齐才能使用拆分进行处理。
  • 是的,这是第一个想法。然后,如果其中一个拆分文件损坏,则需要再次完成整个数据集。:(。顺便说一句,您的回答是在 16 核机器上已经加速了大约 10 倍。

标签: bash parallel-processing split gnu tar


【解决方案1】:

似乎最好的并行 gzip 压缩工具是pigz。见comparisons。

有了它,你可以有这样的命令:

tar -c "${dir}" | pigz -c | split -a 5 -d -b "${size}" - "${name}"

使用其选项-p,您还可以指定要使用的线程数(默认为在线处理器数,如果未知,则为8)。请参阅pigz --help 或man pigz 了解更多信息。

更新

使用 GNU 并行你可以这样做:

contents=("$dir"/*)
outdir=/somewhere
parallel tar -cvpzf "${outdir}/{}.tar.gz" "$dir/{}" ::: "${contents[@]##*/}"

【讨论】:

  • 如何将文件解压缩回文件夹。我指的是 pigz 选项。
  • 似乎以下内容可以完成工作:cat prefix* > name_of_tar.tar.gz 然后您可以解压缩“name_of_tar.tar.gz”。
  • @Arash_D_B 或者直接将其通过管道传输到 tar:cat prefix* | tar -xz
  • 仅供参考 tar 文件通常不可连接,您需要在提取时传递 --ignore-zeros 否则 tar 文件结尾块(1k 的空值)会导致问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2012-09-14
  • 1970-01-01
  • 2020-09-29
  • 2015-01-14
  • 2014-04-10
  • 1970-01-01
相关资源
最近更新 更多