使用 xargs 和 cat 并行运行脚本

使用 xargs 和 cat 并行运行脚本

我正在将大量 CSV 文件插入数据库。我想并行执行,例如运行 4 个进程。现在我用这样的脚本来做:

find . -name "*.csv" | xargs -n 1 -P 4 ./run.sh 

并将run.sh文件发送到数据库:

cat "$1" | db-client "INSERT INTO ..."

看起来它确实有效,但我的问题是: cat 不会混合来自 4 个进程的输入吗?它是否真的并行运行,或者等待另一个进程完成cat

答案1

  1. 除非您使用with和with ,否则切勿通过管道find进入;否则,带有空格或换行符的文件名将是您的结尾。xargs-print0find-0xargs
  2. 不是 的用例cat "$1" | …,而只是 的用例… < $1可以写得更紧凑,但随你喜欢。
  3. 不,cat不会“混淆”任何东西,因为没有一个cat进程,而是 4 个进程,具有完全隔离的参数列表和输出。
  4. 是的,它确实是并行运行的。
  5. db-client当然,您也可以并行运行多次,但是数据库系统的全部要点是它保持事物的一致性,因此除非您错误地INSERT将语句设计为多个语句而不是原子语句,否则这是安全的。
  6. 并行性在这里根本没有帮助;您的 CSV 文件访问以及数据库写入访问都不受 CPU 限制,而是受底层固有的序列化 IO 限制;所以,你并没有真正解决问题。由于插入是一个写入操作,并且必须与其他并发写入同步,因此并行化可能会使事情变得更加复杂。慢点,不会更快,除非您真的知道您的数据库允许分片写入,并且数据库服务器的带宽比您的存储读取带宽更宽 - 嗯,考虑到您的问题,这不太可能。

相关内容