2013-03-11 5 views
5

मेरे पास ऐसी मशीन तक पहुंच है जहां मेरे पास 10 कोर तक पहुंच है - और मैं वास्तव में उनका उपयोग करना चाहता हूं। क्या मैं अपने ही मशीन पर कर रही करने के लिए इस्तेमाल कर रहा हूँ कुछ इस तरह होगा:बैश: एकाधिक कोर पर एक ही प्रोग्राम चलाना

for f in *.fa; do 
    myProgram (options) "./$f" "./$f.tmp" 
done 

मैं 10 फ़ाइलें मैं पर ऐसा करना चाहते हैं - के, blah01.fa उन्हें blah00.fa कॉल, .. blah09.fa।

इस दृष्टिकोण के साथ समस्या यह है कि मेरा प्रोग्राम केवल एक समय में 1 कोर का उपयोग करता है, और इसे बहु-कोर मशीन पर ऐसा करने के लिए मैं 10 बार एक समय में 1 कोर का उपयोग कर रहा हूं, इसलिए मैं नहीं होगा अपनी अधिकतम क्षमता के लिए मेरी मास्किन का उपयोग करना।

मैं अपनी स्क्रिप्ट कैसे बदल सकता हूं ताकि यह मेरे सभी 10fa फ़ाइलों को एक ही समय में चला सके? मैंने Run a looped process in bash across multiple cores पर देखा लेकिन मुझे उस से कमांड प्राप्त नहीं हो सका जो मैं चाहता था।

+2

आपने 'gnu समानांतर' की कोशिश की? तुम्हारे लिए क्या काम नहीं किया? –

+1

क्या आपने उस उत्तर में gnu समानांतर सुझाव का उपयोग करने का प्रयास किया है? –

+2

'seq 0 10 | समानांतर myProgram -opt1 -opt2 ./blah{}.fa ./blah {}। tmp' –

उत्तर

8

आप इस्तेमाल कर सकते हैं

for f in *.fa; do 
    myProgram (options) "./$f" "./$f.tmp" & 
done 
wait 

जो आप समानांतर में नौकरियों के सभी शुरू होगा, तो इंतजार वे जब तक सभी पर जाने से पहले पूरा हो गया। इस मामले में जहां आपके पास कोर की तुलना में अधिक नौकरियां हैं, आप उन सभी को शुरू करेंगे और आपके ओएस शेड्यूलर को प्रक्रियाओं को स्वैप करने के बारे में चिंता करने दें।

एक संशोधन के लिए एक समय

count=0 
for f in *.fa; do 
    myProgram (options) "./$f" "./$f.tmp" & 
    ((count ++))   
    if ((count = 10)); then 
     wait 
     count=0 
    fi 
done 

में 10 नौकरियों शुरू करने के लिए है, लेकिन यह parallel का उपयोग कर, क्योंकि आप नए रोजगार शुरू नहीं कर सकते पुराने लोगों को समाप्त कर के रूप में करने के लिए अवर है, और आप भी एक है, तो पता नहीं लगा सकते 10 नौकरियां शुरू करने के प्रबंधन से पहले पुरानी नौकरी समाप्त हो गई। wait आपको एक विशेष प्रक्रिया या सभी पृष्ठभूमि प्रक्रियाओं पर प्रतीक्षा करने की अनुमति देता है, लेकिन पृष्ठभूमि प्रक्रियाओं के मनमाने ढंग से सेट में से कोई भी पूरा होने पर आपको यह नहीं बताता है।

+2

बैश के अगले संस्करण के लिए एक विकल्प होगा ('wait -n')। वर्तमान में आप कुछ ऐसा कर सकते हैं [this] (https://gist.github.com/ormaaj/3911059) लेकिन कुछ बग्स के कारण यह थोड़ा सा है जो अगले संस्करण में भी तय किया जाएगा। – ormaaj

3

क्या आपने Parallel का उपयोग करने पर विचार किया है?

4
जीएनयू साथ

समानांतर आप कर सकते हैं:

parallel myProgram (options) {} {.}.tmp ::: *.fa 

से: http://git.savannah.gnu.org/cgit/parallel.git/tree/README

= पूर्ण स्थापना =

जीएनयू समानांतर की पूर्ण स्थापना के रूप में सरल है के रूप में:

./configure && make && make install 

यदि आप रूट नहीं हैं तो आप अपने पथ में ~/bin जोड़ सकते हैं और 012 में इंस्टॉल कर सकते हैं~/bin और ~/शेयर:

./configure --prefix=$HOME && make && make install 

या अपने सिस्टम का अभाव है 'बनाने' आप बस अपने रास्ते में एक निर्देशिका के लिए src/समानांतर src/sem src/niceload src/एसक्यूएल कॉपी कर सकते हैं।

= मिनिमल स्थापना =

तुम सिर्फ समानांतर की जरूरत है और जरूरत नहीं है 'बनाने' स्थापित किया है (शायद प्रणाली पुरानी है या माइक्रोसॉफ्ट विंडोज):

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 
mv parallel sem dir-in-your-$PATH/bin/ 

घड़ी परिचय वीडियो जानने के लिए अधिक: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

0
# Wait while instance count less than $3, run additional instance and exit 
function runParallel() { 
    cmd=$1 
    args=$2 
    number=$3 
    currNumber="1024" 
    while true ; do 
     currNumber=`ps -e | grep -v "grep" | grep " $1$" | wc -l` 
     if [ $currNumber -lt $number ] ; then 
      break 
     fi 
     sleep 1 
    done 
    echo "run: $cmd $args" 
    $cmd $args & 
} 

loop=0 
# We will run 12 sleep commands for 10 seconds each 
# and only five of them will work simultaneously 
while [ $loop -ne 12 ] ; do 
    runParallel "sleep" 10 5 
    loop=`expr $loop + 1` 
done 
संबंधित मुद्दे