Arzybek Asked: 2022-01-26 03:32:00 +0800 CST2022-01-26 03:32:00 +0800 CST 2022-01-26 03:32:00 +0800 CST 使用 xargs 和 cat 并行运行脚本 772 我在数据库中插入了很多 CSV 文件。我想并行执行,例如运行 4 个进程。现在我用这样的脚本来做: find . -name "*.csv" | xargs -n 1 -P 4 ./run.sh 并将run.sh文件存储到数据库: cat "$1" | db-client "INSERT INTO ..." 它似乎有效,但我的问题是: cat 不会混淆来自 4 个进程的输入,它真的是并行运行还是等到另一个进程完成cat? bash cat 1 个回答 Voted Best Answer Marcus Müller 2022-01-26T05:14:43+08:002022-01-26T05:14:43+08:00 除非您使用with和with ,否则永远不要find输入管道;否则,带有空格或换行符的文件名将结束。xargs-print0find-0xargs 不是用于 的用例cat "$1" | …,而只是用于… < $1. 可以写得更紧凑,但随你喜欢。 不,cat不会“混淆”任何东西,因为没有一个cat进程,而是 4 个进程,具有完全隔离的参数列表和输出。 是的,它确实是并行运行的。 当然,您db-client也可以并行运行多次,但是数据库系统的全部意义在于它使事情保持一致,因此,除非您将INSERT语句设计为多条语句而不是原子语句,否则这是安全的。 并行性在这里根本没有帮助。您的 CSV 文件访问和数据库写入访问都不受 CPU 的限制,而是受其下固有的序列化 IO 限制;所以,你在这里并没有真正解决问题。由于插入是一种写入操作,并且必须与其他并发写入同步,因此并行化可能会使事情变得更慢,而不是更快,除非您真的知道您的数据库允许分片写入,并且进入数据库服务器的带宽比您的存储读取带宽更宽- 嗯,考虑到你的问题,这不太可能。
find
输入管道;否则,带有空格或换行符的文件名将结束。xargs
-print0
find
-0
xargs
cat "$1" | …
,而只是用于… < $1
. 可以写得更紧凑,但随你喜欢。cat
不会“混淆”任何东西,因为没有一个cat
进程,而是 4 个进程,具有完全隔离的参数列表和输出。db-client
也可以并行运行多次,但是数据库系统的全部意义在于它使事情保持一致,因此,除非您将INSERT
语句设计为多条语句而不是原子语句,否则这是安全的。