1

我正在通过终端使用 bash 命令在 Mac 计算机上工作。

我正在运行一个 DNA 测序仪,它在 48 小时内生成约 3-5 百万个文件。出于速度原因,这些文件被保存到计算机的 SSD。我想使用 fswatch 和 rsync 命令来监视目录并将这些文件传输到服务器,因为它们正在生成以减少排序后的长传输时间。

这是我想出的命令。

fswatch -o ./ | (while read; do rsync -r -t /Source/Directory /Destination/Directory; done)

但我担心由于大量文件 > 300 万且总大小 > 100gb,这些工具可能难以跟上。有更好的策略吗?

谢谢你的帮助!

4

2 回答 2

3

您将使用的命令可能有效,但会有一些我想避免的性能问题。

  • “fswatch”会在每次修改 FS 时生成输出(例如每次文件更新。
  • “rsync”每次都会递归检查目录及其子目录和文件中所有可能的更改。(不计算实际的数据拷贝,只有源端和目的端有大量文件和目录时,这个操作需要很长时间)

这意味着对于“fswatch”输出的每一行,都会启动一个“rsync”实例,而“rsync”的持续时间会越来越长。

48 小时是很多时间,并且复制文件(~100GB)无论如何都不会花费这么长时间(磁盘到磁盘非常快,通过千兆网络也非常快)。

相反,我会建议rsync -a --delete /source /destination在生成过程中定期(例如 30 分钟)执行一次,并在最后执行一次,以确保没有遗漏任何内容。一个简短的脚本可能包含:

#!/bin/bash
while ps -ef | grep -q "process that generates files"; do
    echo "Running rsync..."
    rsync -a --delete /source /destination
    echo "...waiting 30 minutes"
    sleep 1800 # seconds
done
echo "Running final rsync..."
rsync -a --delete /source /destination
echo "...done."

...只需将“生成文件的进程”替换为生成文件的进程在运行时在“ps -ef”输出中看起来像的任何名称。根据需要调整时间,我认为在 30 分钟内会创建约 2GB 的数据,这些数据可以在几分钟内复制。

该脚本将确保“rsync”不会运行更多次,它将专注于复制文件而不是经常比较源和目标。

选项“-a”(存档)将暗示您使用的选项和更多(-rlptgoD),“--delete”将删除“/destination”上存在但“/source”上不存在的任何文件(在临时文件被复制但最终结构中实际上不需要的情况下很方便)。

于 2017-05-09T19:28:50.977 回答
1

文件系统限制可能会成为问题。

看到这个答案: 我可以在一个目录中放多少个文件?

通常,目录中的文件越多,文件系统的执行速度就越慢。

于 2017-05-09T14:49:02.560 回答