我有一个需要在 Linux 系统上复制的文件列表 - 每个文件的大小从 10 到 100GB 不等。
我只想复制到本地文件系统。有没有办法并行执行此操作 - 使用多个进程,每个进程负责复制一个文件 - 在一个简单的方式?
我可以轻松编写一个多线程程序来执行此操作,但我感兴趣的是了解是否有一种低级 Linux 方法可以执行此操作。
答案1
如果你的系统没有被它搞垮(例如,也许文件在缓存中),那么 GNU Parallelhttp://www.gnu.org/software/parallel/可能对你有用:
find . -type f -print0 | parallel -0 -j10 cp {} destdir
这将运行 10 个并发cp
。
优点:阅读简单。
缺点:GNU Parallel 在大多数系统上不是标准 - 所以您可能必须安装它。
如果要保留目录结构:
find . -type f -print0 |
parallel -0 -j10 mkdir -p destdir/{//}';' cp {} destdir/{//}
观看介绍视频以了解更多信息:http://www.youtube.com/watch?v=OpaiGYxkSuQ
也可以看看https://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/有关并行磁盘 I/O 的讨论。
答案2
没有针对此问题的低级机制,原因很简单:这样做会破坏系统性能。对于盘式驱动器,每次写入都会争夺磁头的位置,从而导致大量 I/O 等待。对于 SSD,这最终会导致一个或多个系统总线饱和,从而引发其他问题。
答案3
如上所述,这是一个糟糕的想法。但我相信每个人都应该能够实施自己的可怕计划,所以...
for FILE in *;do cp $FILE <destination> &;done
星号可以用文件的正则表达式替换,或者$(cat <listfile>)
如果您已将它们全部放在文本文档中。&符号在后台启动命令,因此循环将继续,产生更多副本。
如上所述,这将彻底摧毁您的 IO。所以...我真的不建议这样做。
——克里斯托弗·卡雷尔
答案4
这是一个分布式/并行和分散式文件复制工具,它将对文件进行分块并并行复制所有块。如果您拥有支持多个流的 SSD 或具有多个磁盘头的某种设置,它可能只会对您有所帮助。