xargsで複数のPerlインスタンスを実行する

xargsで複数のPerlインスタンスを実行する

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-rfile*.txtnullglob

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並列スケジューリング

インストールする

セキュリティ上の理由から、パッケージマネージャを使用して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

関連情報