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