在 Unix 上执行并行复制的最佳方法是什么?

在 Unix 上执行并行复制的最佳方法是什么?

我经常需要将网络文件系统上的文件夹内容复制到本地计算机。远程文件夹中有很多文件(1000 个),这些文件都相对较小,但由于网络开销,常规复制cp remote_folder/* ~/local_folder/需要很长时间(10 分钟)。

我相信这是因为文件是按顺序复制的——每个文件都要等到前一个文件完成后才开始复制。

提高此复制速度的最简单方法是什么?(我认为是并行执行复制。)

复制之前压缩文件并不一定会加快速度,因为它们可能都保存在不同服务器的不同磁盘上。

答案1

只要限制正在运行的复制命令,您就可以使用类似以下脚本的脚本审查者

SOURCEDIR="$1"
TARGETDIR="$2"
MAX_PARALLEL=4
nroffiles=$(ls "$SOURCEDIR" | wc -w)
setsize=$(( nroffiles/MAX_PARALLEL + 1 ))
ls -1 "$SOURCEDIR"/* | xargs -n "$setsize" | while read workset; do
  cp -p "$workset" "$TARGETDIR" &
done
wait

答案2

如果你有 GNU Parallelhttp://www.gnu.org/software/parallel/安装后你可以这样做:

parallel -j10 cp {} destdir/ ::: *

您可以通过以下方式轻松安装 GNU Parallel:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 883c667e01eed62f975ad28b6d50e22a
12345678 883c667e 01eed62f 975ad28b 6d50e22a
$ md5sum install.sh | grep cc21b4c943fd03e93ae1ae49e28573c0
cc21b4c9 43fd03e9 3ae1ae49 e28573c0
$ sha512sum install.sh | grep da012ec113b49a54e705f86d51e784ebced224fdf
79945d9d 250b42a4 2067bb00 99da012e c113b49a 54e705f8 6d51e784 ebced224
fdff3f52 ca588d64 e75f6033 61bd543f d631f592 2f87ceb2 ab034149 6df84a35
$ bash install.sh

命令、参数和选项的解释

  • 并行 --- 相当明显;调用并行命令
  • -j10 ------- 并行运行10个作业
    • 每台机器上的作业槽数量。最多可并行运行 N 个作业。0 表示数量越多越好。默认值为 100%,即每台机器上每个 CPU 运行一个作业。-男人深度链接
  • cp -------- 并行运行的命令
  • {} --------- 在此处替换收到的值。即source_file命令的参数cp
    • 此替换字符串将被从输入源读取的整行替换。输入源通常是 stdin(标准输入),但也可以使用 -a、::: 或 :::: 指定。替换字符串 {} 可以使用 -I 更改。如果命令行不包含替换字符串,则将 {} 附加到命令行。-男人深度链接
  • destdir/——目标目录
  • ::: -------- 告诉 parallel 使用下一个参数作为输入而不是 stdin
    • 使用命令行中的参数作为输入源,而不是 stdin(标准输入)。与 GNU parallel 的其他选项不同,::: 位于命令之后和参数之前。-男人深度链接
  • * ---------- 当前目录中的所有文件

了解更多

您的命令行将会因此而爱上您。

查看更多示例:http://www.gnu.org/software/parallel/man.html

观看介绍视频: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

完成教程: http://www.gnu.org/software/parallel/parallel_tutorial.html

获取《GNU Parallel 2018》这本书 http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html 或从以下网址下载:https://doi.org/10.5281/zenodo.1146014至少阅读第 1 章和第 2 章。这应该花费不到 20 分钟的时间。

打印备忘单: https://www.gnu.org/software/parallel/parallel_cheat.pdf

注册电子邮件列表以获取支持: https://lists.gnu.org/mailman/listinfo/parallel

答案3

老实说,最好的工具是 Google 的 gsutil。它使用目录递归处理并行复制。我见过的大多数其他方法都无法处理目录递归。他们的文档中没有特别提到本地文件系统到本地文件系统的复制,但它确实有效。

这是另一个需要安装的二进制文件,但考虑到现在所有的云服务采用,您可能已经运行它了。

答案4

使用 find 进行并行 rsync:

export SOURCE_DIR=/a/path/to/nowhere
export DEST_DIR=/another/path/to/nowhere

# sync folder structure first
rsync -a -f'+ */' -f'- *' $SOURCE_DIR $DEST_DIR

# cwd
cd $SOURCE_DIR

# use find to help filter files etc. into list and pipe into gnu parallel to run 4 rsync jobs simultaneously
find . -type f | SHELL=/bin/sh parallel --linebuffer --jobs=4 'rsync -av {} $DEST_DIR/{//}/'

在企业局域网上,单个 rsync 大约能达到 800Mbps;如果有 6-8 个作业,我能够达到超过 2.5Gbps(以高负载为代价)。受磁盘限制。

相关内容