シェルスクリプトを使用して異なる入力を使用して同じファイルの複数のコピーを並列に実行する

シェルスクリプトを使用して異なる入力を使用して同じファイルの複数のコピーを並列に実行する

データファイルを入力として使用する「Analytic.C」ファイルがあるとします。データファイル名は「a.00001.txt」から「a.01000.txt」までです。すべてのファイルを繰り返す1つの方法は、sed「Analytic.C」の入力ファイル名を0001から1000まで繰り返し変更するために使用するシェルスクリプトを作成することです。ただし、一度に1つの入力ファイルを実行する必要があります。

私が望むのは、「Analytic.C」ファイルの複数のインスタンスを並列に実行し、各インスタンスで異なる入力を受け取ることです(ここでの制約は、私のコンピュータに余裕があるコアの数のようです)。同時に発生します。どうすればいいですか?

答え1

GNU Parallelでは、次のことができます。

parallel analysis.C ::: *.txt

.txtまたは - ファイルが多い場合:

printf '%s\0' *.txt | parallel -0 analysis.C

デフォルトでは、各CPUスレッドは1つのジョブを実行します。これは-j20、20の並列操作に合わせて拡張できます。

- ソリューションとは異なり、parallel.moreutils出力を後処理できます。出力はシリアル化されているため、両方のジョブの混合出力は表示されません。

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://doi.org/10.5281/zenodo.1146014

サポートを受けるには、メールリストに参加してください。https://lists.gnu.org/mailman/listinfo/parallel

答え2

parallelコマンド(複数のディストリビューションのパッケージ)を参照してくださいmoreutils。マニュアルページから:

指定されたコマンドを並列に実行して、指定された単一の引数を渡します。これは各パラメータに対して繰り返されます。ジョブは並列に実行できます。デフォルトでは、CPUごとに1つのジョブが実行されます。

だから:

parallel analysis.C -- a.0????.txt

関連情報