xargsとcatを使用してスクリプトを並列に実行する

xargsとcatを使用してスクリプトを並列に実行する

データベースに多数のCSVファイルを挿入しています。たとえば、4つのプロセスを実行するなど、並列に実行したいと思います。次に、次のスクリプトを使用して実行します。

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

run.shファイルをデータベースに送信します。

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

うまくいくようですが、私の質問は:4つのプロセスの入力を混在させませんか?実際には並列に実行されますか、それとも別のプロセスが完了するのを待ちますかcat

答え1

  1. withとwithを使用しない限り、パイプを使用しないでくださいfind。それ以外の場合は、スペースまたは改行文字を含むファイル名になります。xargs-print0find-0xargs
  2. ユースケースではなくcat "$1" | …単なるユースケースです… < $1必要に応じてより簡潔に作成できます。
  3. いいえ、1つのプロセスではなく、完全に分離されたパラメータのリストと出力を持つ4つのプロセスがcatあるため、何も「難読化」されません。cat
  4. はい、並列に実行されます。
  5. db-clientもちろん、並列に複数回実行することもできますが、データベースシステムの要点は一貫性を維持することですINSERT
  6. 並列性はここではまったく役に立ちません。 CSVファイルアクセスとデータベース書き込みアクセスはCPUに限定されず、むしろデフォルトのシリアル化されたIO制限によって制限されるため、実際に問題を解決することはできません。挿入は書き込み操作であり、他の同時書き込みと同期する必要があるため、並列化によって状況がより複雑になる可能性があります。ゆっくり、データベースがシャーディングされた書き込みを許可し、データベースサーバーの帯域幅がストレージの読み取り帯域幅よりも広いことを実際に知らない限り、高速ではありません。まあ、質問にはそうではありません。

関連情報