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の合計量を、ジョブあたりの予想メモリ使用量(メモリバインドされている場合)で割った値)に制限できます。

おすすめ記事