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