Eğer yazarken A | B
, her iki işlem zaten paralel olarak çalıştırılır. Onları yalnızca tek bir çekirdek olarak görüyorsanız, bunun nedeni büyük olasılıkla CPU benzeşimi ayarlarından (belki de farklı bir benzeşime sahip bir işlem oluşturmak için bazı araçlar vardır) veya bir işlemin tüm çekirdeği tutmak için yeterli olmaması ve sistemin " hesaplamayı yaymamayı tercih ediyor.
Bir B ile birkaç B çalıştırmak için split
, aşağıdaki --filter
seçenek gibi bir araca ihtiyacınız vardır :
A | split [OPTIONS] --filter="B"
Ancak bu, çıktılardaki satırların sırasını bozmakla yükümlüdür, çünkü B işleri aynı hızda çalışmaz. Bu bir sorunsa, B i-th çıkışını bir ara dosyaya yönlendirmeniz ve sonunda kullanarak birleştirmeniz gerekebilir cat
. Bu da, kayda değer bir disk alanı gerektirebilir.
Diğer seçenekler mevcut (B bütün "yuvarlak" bittikten bir, bir eşdeğer bitene kadar beklemek mesela tek bir satır tamponlu çıkışına B her örneğini sınırlayabilir, azaltmak için split
'ın harita ve cat
geçici çıkışı birlikte), değişen verimlilik seviyeleri ile. Az önce açıklanan 'yuvarlak' seçeneği B'nin en yavaş örneğinin bitmesini bekleyecek , bu nedenle B için mevcut ara belleğe alma işlemine büyük ölçüde bağlı olacaktır; [m]buffer
işlemlerin ne olduğuna bağlı olarak yardımcı olabilir veya olmayabilir.
Örnekler
İlk 1000 sayıyı oluşturun ve çizgileri paralel olarak sayın:
seq 1 1000 | split -n r/10 -u --filter="wc -l"
100
100
100
100
100
100
100
100
100
100
Çizgileri "işaretleyecek olsaydık, her birinci satırın # 1 işlemine, her beşinci satırın da # 5 işlemine gönderildiğini görürdük. Dahası, split
ikinci süreci doğurma zamanında , birincisi kotasına zaten iyi bir yoldur:
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
Zaman, bir 2-çekirdekli makinesi üzerinde çalışan seq
, split
ve wc
işlemler çekirdekler paylaşır; ancak daha yakından bakarsak, sistem ilk iki işlemi CPU0'da bırakır ve CPU1'i çalışan işlemler arasında böler:
%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
Özellikle split
önemli miktarda CPU yediklerine dikkat edin . Bu A'nın ihtiyaçları ile orantılı olarak azalacaktır; yani A, daha ağır bir işlemse seq
, göreli yükü split
azalacaktır. Ama (böylece hiçbir gerektiğini fazla 2-3 B A ile birlikte tutmak için) bir çok hafif bir süreçtir ve B oldukça hızlıdır, o zaman birlikte koşutlama split
(ya da genel olarak borular) olabilir değer bu olamaz.
A | B | C
Ayrı işlemlerde olduğu gibi paralel olsa da, boruların doğası nedeniyle (B, A'nın çıkışını beklemek zorundadır, C, B'nin çıkışını beklemek zorundadır), bazı durumlarda hala doğrusal olabilir. Tamamen ne tür çıktılar ürettiklerine bağlıdır. Çoklu çalışmanın çokB
yardımcı olacağı pek çok durum yoktur,wc
bölme normal olarak saymaktan daha fazla kaynak alabileceğinden , paralel wc örneğinin normalden daha yavaş olması tamamen mümkündür . Dikkatli kullanın.