を記述するとA | B
、両方のプロセスがすでに並行して実行されます。1つのコアのみを使用していると思われる場合、CPUアフィニティ設定(おそらく、異なるアフィニティのプロセスを生成するツールがある)か、1つのプロセスではコア全体を保持するには不十分であり、コンピューティングを普及させたくない」。
1つのAで複数のBを実行split
するには、--filter
オプションなどのツールが必要です。
A | split [OPTIONS] --filter="B"
ただし、Bジョブはすべて同じ速度で実行されるわけではないため、これは出力の行の順序を台無しにしがちです。これが問題になる場合は、B i番目の出力を中間ファイルにリダイレクトし、最後にを使用してつなぎ合わせる必要がありますcat
。これにより、かなりのディスク容量が必要になる場合があります。
その他のオプションがあります(たとえば、Bの各インスタンスを単一の行バッファー出力に制限し、Bの「ラウンド」全体が終了するまで待機し、reduce to split
のmapに相当するものを実行しcat
、一時出力を一緒に実行できます)、さまざまなレベルの効率で。たとえば、今説明した「ラウンド」オプションは、Bの最も遅いインスタンスが終了するまで待機するため、Bの使用可能なバッファリングに大きく依存します。[m]buffer
操作が何であるかに応じて、役立つ場合もあれば、そうでない場合もあります。
例
最初の1000個の数値を生成し、並行して行をカウントします。
seq 1 1000 | split -n r/10 -u --filter="wc -l"
100
100
100
100
100
100
100
100
100
100
行を「マーク」すると、最初の各行がプロセス#1に送信され、5行目がプロセス#5に送信されます。さらに、split
2番目のプロセスを生成するのにかかる時間では、最初のプロセスが既にその割り当てに適した方法です。
seq 1 1000 | split -n r/10 -u --filter="sed -e 's/^/$RANDOM - /g'" | head -n 10
19190 - 1
19190 - 11
19190 - 21
19190 - 31
19190 - 41
19190 - 51
19190 - 61
19190 - 71
19190 - 81
2コアマシンで実行する場合seq
、split
およびwc
プロセスはコアを共有します。よく見ると、システムは最初の2つのプロセスをCPU0に残し、CPU1をワーカープロセスに分割します。
%Cpu0 : 47.2 us, 13.7 sy, 0.0 ni, 38.1 id, 1.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 15.8 us, 82.9 sy, 0.0 ni, 1.0 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5314 lserni 20 0 4516 568 476 R 23.9 0.0 0:03.30 seq
5315 lserni 20 0 4580 720 608 R 52.5 0.0 0:07.32 split
5317 lserni 20 0 4520 576 484 S 13.3 0.0 0:01.86 wc
5318 lserni 20 0 4520 572 484 S 14.0 0.0 0:01.88 wc
5319 lserni 20 0 4520 576 484 S 13.6 0.0 0:01.88 wc
5320 lserni 20 0 4520 576 484 S 13.3 0.0 0:01.85 wc
5321 lserni 20 0 4520 572 484 S 13.3 0.0 0:01.84 wc
5322 lserni 20 0 4520 576 484 S 13.3 0.0 0:01.86 wc
5323 lserni 20 0 4520 576 484 S 13.3 0.0 0:01.86 wc
5324 lserni 20 0 4520 576 484 S 13.3 0.0 0:01.87 wc
特にsplit
、かなりの量のCPUを消費していることに注意してください。これは、Aのニーズに比例して減少します。つまり、Aがよりも重いプロセスである場合seq
、の相対的なオーバーヘッドsplit
は減少します。しかし、Aが非常に軽量なプロセスであり、Bが非常に高速な場合(Aと一緒に保持するために2〜3個のBしか必要ない場合)、並列化split
(または一般的なパイプ)は価値がないかもしれません。
A | B | C
によるパイプの性質のために、別々のプロセスのように平行であり、それはまだいくつかのケースでは線形であってもよい(BはAの出力を待たなければならない、CはBの出力を待たなければなりません)。それは彼らがどのような出力を生成するかに完全に依存します。複数の実行B
が大いに役立つケースは多くありません。並列wcの例はwc
、分割が通常行をカウントするよりも多くのリソースを消費する可能性があるため、通常よりも遅い可能性があります。注意して使用してください。