लूप के लिए समानांतर बनाना


9

मैं forनिम्नलिखित कोड के छोरों को समानांतर करना चाहता हूं । यह कैसे करना है?

#!/bin/bash
N=$1 
n=$2
for (( i=1; i<=$N; i++ )); do
  min=100000000000000  //set min to some garbage value
  for (( j=1; j<=$n; j++ )); do
    val=$(/path/to/a.out)
    val2=`echo $val | bc`  

      if (( $val2 < $min )); then
        min=$val2; 
      fi
  done
  arr=("${arr[@]}" "$min")
done


जवाबों:


10
#!/bin/bash
# set -x # debug version
N=${1:-123}
n=${2:-45}
workers=${workers:-${3:-10}}
((workers < 1)) && ((workers = 1))
((workers > 20)) && ((workers = 20))

((min=100000000000000))  #set min to some garbage value

work() {
  for i in ${*}; do
    for (( j=1; j<=${n}; j++ )); do
      val=$(/path/to/a.out)
      val2=$(echo ${val} | bc)
      (( val2 < min )) && (( min = val2 ));
    done
    echo ${min}
    # # debug version
    # echo ${i} ${j} ${min}
  done
}

# --
arr=($(
  seq ${N} | xargs -n$[N/workers + 1] | while read i; do
    work ${i} &
  done
  wait
))
echo ${arr[*]}
# --

# # debug version
# seq ${N} | xargs -t -n$[N/workers + 1] | while read i; do
#  work ${i} &
# done
# wait

प्रक्रियाओं के एक मानकीकृत संख्या को पैदा करते समय हमेशा श्रमिकों का उपयोग करें और उन श्रमिकों की अधिकतम संख्या को सीमित करें जो स्पॉन कर सकते हैं

xargs -n | while read बैचों में सूची को पुनरावृत्त करने का एक सरल साधन है।

  • seq 1 से N तक संख्याओं की सूची बनाता है।
  • xargs -n उस सूची को एन / श्रमिकों + 1 बैचों में तोड़ता है।
    • उदा। N = 100 श्रमिक = 10 1 से 100 तक 11 संख्याओं की 10 रेखाएँ निर्मित करेगा।
  • while read i संख्याओं की प्रत्येक पंक्ति को पढ़ता है।
  • work ${i} &बस संख्या के बैच के workसाथ फ़ंक्शन को कॉल करता है ${i}

डिबग करने के लिए मैंने कमेंट-आउट डिबग कोड जोड़ा है। बस echoडिबग संस्करण के # --साथ कोड और इसके डिबग संस्करण के बीच के कोड को बदलें और आप देख सकते हैं कि यह बैचों पर कैसे काम करता है। set -xअधिक विस्तृत डीबग आउटपुट के लिए Uncomment , जिसे आप किसी फ़ाइल पर रीडायरेक्ट करना चाहते हैं।

डिबग संस्करण को चलाने के लिए विभिन्न मापदंडों के साथ यह देखें कि यह कैसे संचालित होता है:

parallel.sh 223 5 1
parallel.sh 223 5 5
parallel.sh 223 5 10
parallel.sh 223 5 20

अस्वीकरण: यह कोड minकार्यकर्ता प्रक्रियाओं के बीच मूल्य को सिंक्रनाइज़ नहीं करता है। न्यूनतम मूल्य प्राप्त करना एक भयानक अभ्यास नहीं है। यह शायद करेंगे:

parallel.sh 223 5 20 | tr ' ' '\n' | sort -n | head -1

या केवल स्क्रिप्ट में ही जोड़ें:

echo ${arr[*]} | tr ' ' '\n' | sort -n | head -1

क्या आप कोड समझा सकते हैं? मेरे लिए यह स्पष्ट नहीं है कि आपने यहां मजदूर सूत्र का उपयोग कैसे किया है।
RIchard विलियम्स 13

@ प्रसेनजीत ने किया। मुझे उम्मीद है कि यह मददगार होगा।
nicerobot

8

GNU समानांतर का उपयोग:

#!/bin/bash

N=$1
n=$2

arr=($(
# Generate all combinations of 1..n and 1..N
parallel -k --tag /path/to/a.out {1} {2} '|' bc :::: <(seq $N) <(seq $n) |
  perl -ane 'BEGIN{$min=1e30} $last||=$F[0]; if($F[0] != $last) {print $min,"\n";$min=1e30;$last=$F[0]} $min = $F[2]<$min ? $F[2] : $min; END {print $min,"\n"}'
))
echo ${arr[*]}

यह /path/to/a.outप्रत्येक सीपीयू पर चलेगा । आउटपुट इस प्रकार होगा:

1 1 19269
1 2 6158
1 3 2794
1 4 25104
2 1 13160
2 2 32683
2 3 12535
2 4 15197
3 1 8228
3 2 7673
3 3 8428
3 4 24463

पर्ल स्क्रिप्ट पहले कॉलम को देखती है और तीसरे कॉलम में न्यूनतम पाती है जिसमें पहला कॉलम है।

आप केवल द्वारा GNU समानांतर स्थापित कर सकते हैं:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel

अधिक जानने के लिए इंट्रो वीडियो देखें: https://www.youtube.com/playlist?list=PL284C9FF2488BC4D1


आपके अंतिम पैराग्राफ का लिंक फेसबुक लुकिंग पेज पर लिंक होता है जो आगंतुक को बताता है कि उसने एक विशेष उपहार (विज्ञापन या घोटाला) जीता है। कोई वीडियो नहीं हैं। आपको इसे हटा देना चाहिए।
मार्को
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.