dataProcessing.pl
タブで区切られた.txt
ファイルを許可し、埋め込まれたデータに対して多くの処理を実行するスクリプトがあります。file1.txt file2.txt file3.txt
現在、bashスクリプトの一部として繰り返され、各反復中にperlを呼び出す複数の入力ファイル()があります(つまり、一度に1つの入力ファイルを処理します)。
しかし、可能であれば、Perlの複数のインスタンスを実行し、xargsを介してすべての入力ファイルを同時に処理したいと思います。私はあなたが次のようなことを実行できることを知っています。
perl -e 'print "Test" x 100' | xargs -P 100
しかし、Perlの開いている各並列インスタンス(file1.txtの1つのインスタンス、file2.txtのインスタンスなど)に異なるファイルを渡したいと思います。ファイルハンドルまたはファイルパスはPerlに引数として渡すことができます。どうすればいいですか?たとえば、ファイル名をxargsに渡す方法がわかりません。
答え1
使用xargs
の意味-n 1
は、「ユーティリティへの各呼び出しに1つの引数のみを渡す」ことです。
それは次のとおりです。
printf '%s\n' file*.txt | xargs -n 1 -P 100 perl dataProcessing.pl
ファイル名にリテラル改行文字が含まれていないとします。
GNU またはそのxargs
実装 (NULL で区切られた引数の読み取り、改行文字を含むファイル名を受け入れる)、および (何も一致せず、有効な場合は空の引数のリストなしでユーティリティを実行するため)、次のようにできます。xargs
-0
-r
file*.txt
nullglob
printf '%s\0' file*.txt | xargs -r0 -n 1 -P 100 perl dataProcessing.pl
どちらのバリアントでも最大100個のスクリプト並列インスタンスを起動できますが、これは望ましい結果ではない可能性があります。これは、コンピュータのCPU数に関連する合理的な数(または使用可能なRAMの合計量を、ジョブあたりの予想メモリ使用量(メモリバインドされている場合)で割った値)に制限できます。
答え2
ここでは派手な必要はありません。 bash forループでは、perlプロセスをバックグラウンドに設定するだけです。
for f in file*.txt; do
perl dataProcessing.pl "$f" &
done
# wait for them to complete
wait
echo "All done."
答え3
GNU Parallelはまさに以下のために設計されています:
parallel some_command {} ::: *.txt
デフォルトでは、各CPUコアは1つのジョブを実行します。 100 個のジョブを並列に実行するには、次のようにします。
parallel -j100 some_command {} ::: *.txt
Perlを知ったら、GNU Parallelの高度な機能を使用しても快適さを感じることができます。これがどんな役割を果たすと思いますか:
parallel echo '{= s/(\d+)/$1*2/e; s/(.)/uc($1)/e; s/bar/baz/; s/foo/bar/ =}' \
::: 'my foo' 'i went to a baraar to get a 12" crowfoo'
GNU Parallelは、同じコンピュータまたはSSHを介してアクセスできる複数のコンピュータでタスクを並列に簡単に実行できる汎用の並列ハンドラです。
4つのCPUで32の異なるジョブを実行する場合は、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。
代わりに、GNU Parallel はタスクが完了すると新しいプロセスを作成し、CPU をアクティブに保つことで時間を節約します。
インストールする
セキュリティ上の理由から、パッケージマネージャを使用してGNU Parallelをインストールする必要がありますが、GNU Parallelが展開用にパッケージ化されていない場合は、rootアクセスを必要としないプライベートインストールを実行できます。これは10秒で完了できます。
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
その他のインストールオプションについては、以下を参照してください。http://git.savannah.gnu.org/cgit/parallel.git/tree/README
詳細
より多くの例を見る:http://www.gnu.org/software/parallel/man.html
紹介ビデオを見る:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
このチュートリアルを見てください。http://www.gnu.org/software/parallel/parallel_tutorial.html
サポートを受けるには、メールリストに参加してください。https://lists.gnu.org/mailman/listinfo/parallel