Bash

使用 xargs 和 cat 並行執行腳本

  • January 26, 2022

我在數據庫中插入了很多 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
  2. 不是用於 的案例cat "$1" | …,而只是用於… < $1. 可以寫得更緊湊,但隨你喜歡。
  3. 不,cat不會“混淆”任何東西,因為沒有一個cat程序,而是 4 個程序,具有完全隔離的參數列表和輸出。
  4. 是的,它確實是並行執行的。
  5. 當然,您db-client也可以並行執行多次,但是數據庫系統的全部意義在於它使事情保持一致,因此,除非您將INSERT語句設計為多條語句而不是原子語句,否則這是安全的。
  6. 並行性在這裡根本沒有幫助。您的 CSV 文件訪問和數據庫寫入訪問都不受 CPU 的限制,而是受其下固有的序列化 IO 限制;所以,你在這裡並沒有真正解決問題。由於插入是一種寫入操作,並且必須與其他並發寫入同步,因此並行化可能會使事情變得更慢,而不是更快,除非您真的知道您的數據庫允許分片寫入,並且進入數據庫伺服器的頻寬比您的儲存讀取頻寬更寬- 嗯,考慮到你的問題,這不太可能。

引用自:https://unix.stackexchange.com/questions/687843