2012-01-23 14 views
5

हम 50 डाटाफाइलों (अगली पीढ़ी डीएनए अनुक्रम) हर एक पर एक अजगर स्क्रिप्ट चलाने से परिवर्तित करने की आवश्यकता है के साथ एक फ़ोल्डर है। स्क्रिप्ट में प्रति फ़ाइल 5 घंटे लगते हैं और यह सिंगल थ्रेडेड होता है और काफी हद तक सीपीयू बाध्य होता है (सीपीयू कोर न्यूनतम डिस्क आईओ के साथ 99% पर चलता है)।रन 4 समवर्ती उदाहरणों

जब से मैं एक 4 कोर मशीन है, मैं एक बार में इस स्क्रिप्ट का 4 उदाहरणों को चलाने के लिए बेहद प्रक्रिया में तेजी लाने के लिए करना चाहते हैं।

मुझे लगता है मैं एक ही समय में प्रत्येक फ़ोल्डर पर निम्न बैश स्क्रिप्ट चलाने 4 फ़ोल्डरों में डेटा को विभाजित कर सकते हैं और में:

files=`ls -1 *` 
for $file in $files; 
do 
    out = $file+=".out" 
    python fastq_groom.py $file $out 
done 

लेकिन एक फ़ोल्डर पर इसे चलाने के लिए एक बेहतर तरीका होना चाहिए । हम ऐसा करने के लिए बैश/पायथन/पर्ल/विंडोज का उपयोग कर सकते हैं।
हमें समस्या को हल करने के लिए सबसे आसान तरीका है (दुर्भाग्य से बनाने स्क्रिप्ट बहु लड़ी हम क्या कर सकते हैं परे है)


@phs xargs समाधान का उपयोग किया गया था। हालांकि हम मूल डेवलपर उपकरण @ Björn उत्तर का अनुरोध कर रहे हैं। एक बार फिर धन्यवाद!

+2

बैकटिक में 'ls' के उपयोग, और बूट करने के लिए एक चर के लिए मान निर्दिष्ट, एक लगातार antipattern है। यह रिक्त स्थान के साथ फ़ाइल नामों को तोड़ देगा, और यदि आपके पास उपनिर्देशिकाएं हैं तो यह टूट जाएगी। सही मुहावरे 'फ़ाइल में * के लिए है' - एक चर नामकरण करते समय डॉलर के संकेत की अनुपस्थिति भी ध्यान दें; एक चर को इंटरपोल करते समय आप एक डॉलर के संकेत का उपयोग करते हैं। यह भी देखें http://partmaps.org/era/unix/award.html#ls – tripleee

+0

@triplee टिप –

उत्तर

1

xargs पर एक नजर डालें। यह -P विकल्प समांतरता की कॉन्फ़िगर करने योग्य डिग्री प्रदान करता है। विशेष रूप से, कुछ इस तरह आप के लिए काम करना चाहिए:

ls files* | awk '{print $1,$1".out"}' | xargs -P 4 -n 2 python fastq_groom.py 
+1

के लिए धन्यवाद यह उन फ़ाइलों के साथ टूट जाएगा जिनमें उनके नामों में रिक्त स्थान हैं और शायद अन्य नास्टियां जैसे न्यूलाइन और जैसे – SiegeX

7

आप multiprocessing मॉड्यूल का उपयोग कर सकते हैं। मुझे लगता है कि आपके पास प्रक्रिया करने के लिए फ़ाइलों की एक सूची है और प्रत्येक फ़ाइल के लिए कॉल करने के लिए एक फ़ंक्शन है।

from multiprocessing import Pool, cpu_count 

pool = Pool(processes=cpu_count) 
pool.map(process_function, file_list, chunksize=1) 

अपने process_function एक मूल्य वापस नहीं करता है, तो आप बस वापसी-मूल्य अनदेखा कर सकते हैं: तो फिर आप बस इस तरह एक कार्यकर्ता-पूल इस्तेमाल कर सकते हैं।

1

इस एक शॉट दे दो: files नामित एक सरणी में

#!/bin/bash 

files=(*) 
for((i=0;i<${#files[@]};i+=4)); do 
    { 
    python fastq_groom.py "${files[$i]}" "${files[$i]}".out & 
    python fastq_groom.py "${files[$i+1]}" "${files[$i+1]}".out & 
    python fastq_groom.py "${files[$i+2]}" "${files[$i+2]}".out & 
    python fastq_groom.py "${files[$i+3]}" "${files[$i+3]}".out & 
    } 
done 

निम्नलिखित पुट सभी फ़ाइलों। इसके बाद यह पहली चार फाइलों पर चार पायथन प्रक्रियाओं को निष्पादित करता है और पृष्ठभूमि करता है। जैसे ही के रूप में उन प्रक्रियाओं के सभी चार पूरा कर रहे हैं, यह अगले चार निष्पादित करता है। यह रूप में कुशल नहीं है, हमेशा की तरह 4 जाने की एक कतार में रखते हुए, लेकिन अगर सभी प्रक्रियाओं उतना ही समय के आसपास ले, यह बहुत कि के करीब होना चाहिए।

इसके अलावा, कृपया ls के आउटपुट का उपयोग न करें। बस for files in *.txt; do ...; done

0

में के रूप में मानक ग्लोबिंग का उपयोग आप जीएनयू समानांतर है, तो आप कर सकते हैं:

parallel python fastq_groom.py {} {}.out ::: files* 

यह मूल प्रति एक नौकरी को उत्पन्न करने के द्वारा सही काम करेंगे, भले ही आपकी फ़ाइलों के नाम की जगह है, ', या "उनमें से। यह भी सुनिश्चित करता है कि अलग-अलग नौकरियों के आउटपुट को मिश्रित नहीं किया जाता है, इसलिए यदि आप आउटपुट का उपयोग करते हैं तो आपको गारंटी है कि आपको दो अलग-अलग नौकरियों से आधा लाइन नहीं मिलेगी।

जीएनयू समानांतर एक सामान्य समांतरता है और उसी मशीन पर समानांतर में या कई मशीनों पर नौकरियां चलाने में आसान बनाता है जिनके पास आपके पास एसएसएच पहुंच है।

Simple scheduling

जीएनयू समानांतर बजाय एक नई प्रक्रिया जब spawns:

आप 32 विभिन्न नौकरियों आप 4 सीपीयू पर चलाना चाहते हैं, तो parallelize करने के लिए एक सीधे आगे रास्ता प्रत्येक CPU पर 8 नौकरियों को चलाने के लिए है एक खत्म - सीपीयू सक्रिय रखने और समय इस प्रकार की बचत:

GNU Parallel scheduling

स्थापना

यदि आपके वितरण के लिए जीएनयू समानांतर पैक नहीं किया गया है, तो आप व्यक्तिगत स्थापना कर सकते हैं, जिसके लिए रूट पहुंच की आवश्यकता नहीं है। यह 10 सेकंड में ऐसा करके किया जा सकता है:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

के लिए अन्य स्थापना विकल्पों को देखने के http://git.savannah.gnu.org/cgit/parallel.git/tree/README

जानें

अधिक उदाहरण देखें: http://www.gnu.org/software/parallel/man.html

घड़ी परिचय वीडियो: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

टी के माध्यम से चलना वह ट्यूटोरियल: http://www.gnu.org/software/parallel/parallel_tutorial.html

साइन अप करें ईमेल सूची के लिए समर्थन प्राप्त करने के: https://lists.gnu.org/mailman/listinfo/parallel

संबंधित मुद्दे