xargs を使った並列処理
私たちのライブラリが拡大し続けるにつれて、ファイル処理の速度を上げたいと思います。xargs
の -P
オプションを使うと、コマンドを並列で実行できます。これは、I/O バウンドの操作に対して性能を大幅に向上させることができます。
まず、本の内容にタイムスタンプを追加することで本の処理をシミュレートするスクリプトを作成しましょう。
cat ~/project/process_book.sh
次のように表示されるはずです。
#!/bin/bash
echo "Processing $1 at $(date)" > ~/project/processed_$1
sleep 2 ## いくらかの処理時間をシミュレートする
このスクリプトは以下のことを行います。
- 本のタイトルを引数 (
$1
) として受け取ります。
- 本のタイトルの前に "processed_" を付けた新しいファイルを作成します。
- このファイルに、現在の日付と時刻を含むメッセージを書き込みます。
- 2 秒間待機して、いくらかの処理時間をシミュレートします。
次に、xargs
と -P
オプションを使って、本を並列で処理しましょう。
cat ~/project/more_books.txt | xargs -P 3 -I {} ~/project/process_book.sh {}
このコマンドを分解してみましょう。
cat ~/project/more_books.txt
:これは私たちの本のリストを読み取ります。
|
:このパイプ記号は出力を xargs
に送ります。
xargs -P 3
:これは xargs
に対して、最大 3 つのプロセスを並列で実行するように指示します。
-I {}
:これは各入力項目のための置換文字として {}
を定義します。
~/project/process_book.sh {}
:これは各本に対して実行するコマンドで、{}
は本のタイトルに置き換えられます。
このコマンドは、最大 3 冊の本を同時に処理し始めます。コマンドを実行した後、処理済みファイルの内容を確認できます。
cat ~/project/processed_*
次のような出力が表示されるはずで、並列実行が示されています。正確な時間は異なりますが、以下のようなものが表示されるかもしれません。
Processing Pride_and_Prejudice at Mon Aug 12 10:15:01 UTC 2024
Processing The_Catcher_in_the_Rye at Mon Aug 12 10:15:01 UTC 2024
Processing The_Hobbit at Mon Aug 12 10:15:01 UTC 2024
Processing Animal_Farm at Mon Aug 12 10:15:03 UTC 2024
Processing Brave_New_World at Mon Aug 12 10:15:03 UTC 2024
最初の 3 冊の本が同時に処理を開始し、最後の 2 冊が約 2 秒後に開始することに注目してください(スクリプト内の sleep 2
による)。これが並列処理の実際の様子を示しています。