8

私はGNU Parallel totorialに取り組んでいます。「複数の引数」セクションには、次の例があります (注: num30000 は、連続した行に 1 から 30,000 までの番号を持つテキスト ファイルです)。

並列処理を向上させるために、GNU Parallel は、ファイルの終わりに達したときに、すべての並列ジョブ間で引数を分散できます。

4 つのジョブを並行して実行すると、引数の最後の行が 4 つのジョブに分割され、合計 5 つのジョブになります。

  cat num30000 | parallel --jobs 4 -m echo | wc -l

出力:

  5

私の質問は、なぜ合計 5 つのジョブが必要なのですか? 重要かどうかはわかりませんが、明らかにポイントがありません。30,000 は 4 で割り切れるので、4 つのジョブを期待していました。次のコマンドを実行した後、この質問を投稿することにしました。

cat num30000 | parallel --jobs 4 -m echo | colrm 12

その結果:

1 2 3 4 5 6
23696 23697
25273 25274
26850 26851
28427 28428

echoこれは、最初のコマンドに最初の 23,695 個の引数が渡されるように見えます。次に、残りのジョブは、引数カウントが 1577、1577、1577、および 1574 の 4 つのジョブに分割されます。ありがとうございました!

4

2 に答える 2

6

この回答に対するあなたの代価は、最初の読書で理解できるように例を改善するのに役立つことです.

したがって、何が起こるかは次のとおりです。

GNU Parallel は、制限が 131071 であると判断します。次に、現在実行中のジョブの数 (0) を確認します。それは並列に実行するジョブの数より少ないですか (4): 次に、131071 制限まで引数を読み取り、そのジョブを開始します。これが最初の仕事です。

GNU Parallel は再び引数を読み取るようになりました。今回は残りをすべて読み取り、ファイルの終わりに到達します。「ああ」GNU Parallel は考えます。「これがファイルの終わりである場合、すべての引数をすべてのジョブ スロットに分散します (4)。」したがって、残りのすべての引数を取り、それらを 4 つのジョブに分散します。次に、3 つのジョブを開始します。現在、4 つのジョブが実行されています。

実行中のジョブの 1 つが終了し、空きジョブ スロットが提供されます。そのため、GNU Parallel は最終ジョブを開始します。

4 つのコアと 100 個の引数がある場合、この設計の理由はより明確になります。100 個の引数は 1 行に簡単に収まりますが、通常、4 コアのマシンで 25 個の引数を持つ 4 つのジョブを実行すると、100 個のジョブを 1 つ実行するよりも高速になります。引数。

于 2014-01-12T04:25:36.690 に答える
3

私は今、言語を理解しています。この-mパラメータは、できるだけ多くの引数をコマンド ラインに入れるように parallel に要求します。131071 文字という私の制限は、合計 2 つのechoコマンドが生成されることを意味します。1 つ目は 23695 までです。2 つ目は残りです。この--jobs 4パラメーターは、2 番目のコマンドにのみ影響します。これが、チュートリアルで「引数の最後の行」が意味するものです。それで、合計5つのジョブがある理由がわかりました。--jobsただし、引数の最後の行にのみ影響する理由はわかりませんが、それは私が尋ねた質問ではありません。

于 2014-01-10T20:26:46.270 に答える