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