Her ikisi de bittiğinde paralel işlemler nasıl çalıştırılır ve çıktılar birleştirilir


17

Ben bir sekme ayrılmış dosya içine nihai sonuçları yaklaşık 5 veya 6 farklı programlar aracılığıyla bazı veri boru bir bash kabuk komut dosyası var.

Daha sonra aynısını benzer bir veri kümesi için tekrar yaparım ve ikinci bir dosyaya çıktı.

Daha sonra her iki dosya da karşılaştırmalı analiz için başka bir programa girilir. örneğin basitleştirmek

Data1 | this | that |theother | grep |sed | awk |whatever > Data1Res.csv
Data2 | this | that |theother | grep |sed | awk |whatever > Data2Res.csv
AnalysisProg -i Data1res.csv Data2res.csv

Sorum şu: adım1 ve adım2'yi aynı anda nasıl çalıştırabilirim (örn. & Kullanarak), ancak her ikisi de tamamlandığında yalnızca adım3'ü (AnalysisProg) başlatabilirim?

Teşekkür

ps AnalysisProg bir akış veya fifo üzerinde çalışmaz.



BTW, Perl betiklerini kullanmanız uygun mu? Bu, konuyu sizin için çok basitleştirebilir ve bu son işlemeyi çok verimli bir şekilde uygulayabilir ve zahmetsizce paralel çalışmasını sağlayabilirsiniz.
2014'te Bichoy

Perl..o kadar değil, hayır :(
Stephen Henderson

1
Burada girdiyi borular arasında nasıl bölüştüğünütee ve iki eşzamanlı işlemle nasıl işleyeceğimizi göstereceğim grep: unix.stackexchange.com/questions/120333/…
mikeserv

Ve burada bir süreci tamamen arka plana dönüştürmek için basit kabuk yapılarının nasıl kullanılacağını nohupgösterebilirim, ancak yine de süreçle iletişim kurma yollarını sürdürüyorum: unix.stackexchange.com/questions/121253/…
mikeserv

Yanıtlar:


27

Kullanın wait. Örneğin:

Data1 ... > Data1Res.csv &
Data2 ... > Data2Res.csv &
wait
AnalysisProg

niyet:

  • Data1 ve Data2 kanallarını arka plan işleri olarak çalıştırma
  • ikisinin de bitmesini bekleyin
  • AnalysisProg çalıştırın.

Bkz. Örneğin bu soru .


Teşekkürler, iyi görünüyor. Yukarıdaki işe yaramazsa bunu deneyeceğim.
Stephen Henderson

Thx tekrar, biraz beklemek farkındaydı ama biraz googled farklı PID vb ile nasıl çalıştığını karıştı .. Şimdi ben sadece "beklemek" olduğunu görüyorum daft hissediyorum
Stephen Henderson

12

Eğer sadece 2 dosyanız varsa, cxw'nin cevabı tercih edilen çözümdür. 2 dosya sadece örnekse ve gerçekte 10000 dosyanız varsa, '&' çözümü çalışmaz, çünkü sunucunuzu aşırı yükler. Bunun için GNU Parallel gibi bir araca ihtiyacınız var:

ls Data* | parallel 'cat {} | this | that |theother | grep |sed | awk |whatever > {}res.csv
AnalysisProg -i *res.csv

GNU Paralel hakkında daha fazla bilgi edinmek için:


Merhaba teşekkürler. Şu anda iki dosyam var, ama 24 işlemcim var, bu yüzden bir kerede birçok çifti denemek ve çalıştırmak için cazip hissettim - bir bilgisayar bilimi insanı olarak değil, disk darboğazını okumaya değer olup olmayacağı konusunda net değilim. belki emerim ve görürüm;)
Stephen Henderson

@StephenHenderson boyutuna bağlı olarak dosyalar yine de önbellekte olabilir. Hız kritikse, sadece tmpfs kullanabilirsiniz (ve dosyalar <<< sonra RAM'inizdir).
Maciej Piechotka

1
@StephenHenderson Paralel iş sayısı -j ile ayarlanabilir, bu nedenle -j4'ü deneyin ve sunucu aşırı yüklenmezse, -j6'yı deneyin. Ancak CTRL-C'ye basmaya hazır olun: GNU Paralel, sunucuları hızlı bir şekilde aşırı yüklemek için mükemmel bir araçtır . Ayrıca --load'a bir göz atın.
Ole Tange

1

Bunu yapmanın bir yolu şöyle görünebilir:

AnalysisProg <<PREPROCESS /dev/stdin
$( 
{   process1=$( pipe | line | 1 >&2 & echo $! )
    process2=$( pipe | line | 2 >&2 & echo $! )
    while ps -p $process1 $process2 >/dev/null; do
        sleep 1
    done
} 2>&1
)
#END
PREPROCESS

Bu şekilde, her iki boru hattını da arka plan haline getirirsiniz, ancak yine de çıktılarını burada bir belgede değerlendirilen ve AnalysisProg'a teslim edilen stdin'e birleştirmeden önce yürütülmesini tamamlamasını beklersiniz. Kullanabiliyorsanız wait, while psdöngüden daha iyidir , ancak kabuk bağlı olarak, geçerli kabuğun alt öğesi olmayan birwait işlemde beklemesini bildirirseniz itiraz edebilir .

Ayrıca yukarıdaki yöntemin çıktıyı harmanlayacağına dikkat edin - böylece her iki işlem de aynı anda yazılacaktır. Bunun yerine ayrı olmasını veya birini diğerine eklemesini isterseniz, şunları yapabilirsiniz:

AnalysisProg 3<<PREPROCESS /dev/fd/3 /dev/stderr
$(
process1=$(... >&2 ...) 2>/dev/fd/3
...
} 3>/dev/fd/3 2>/dev/stderr
)

Bu kavramları daha önce göstermiştim. Muhtemelen en iyi demolar burada ve burada .


0

Bunu kullanmayı deneyin.

rm -f Data1Res.csv
rm -f Data2Res.csv
Data1 | this | that |theother | grep |sed | awk |whatever > Data1Res.csv &
Data2 | this | that |theother | grep |sed | awk |whatever > Data2Res.csv &
while true
do
  ps aux | grep -v grep | grep -i -E 'Data1Res.csv|Data2Res.csv' &> /dev/null
  if [ $? -ne 0 ]
  then
    AnalysisProg -i Data1res.csv Data2res.csv
    exit 0
  fi
done

Bu ağır bir soru. waitTekerleği yeniden icat etmek gibi değil mi?
John WH Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.