Xargs का उपयोग करके समानांतर में कार्यक्रम चलाना


85

वर्तमान में मेरे पास वर्तमान स्क्रिप्ट है।

#!/bin/bash
# script.sh

for i in {0..99}; do
   script-to-run.sh input/ output/ $i
done

मैं xargs का उपयोग करके इसे समानांतर में चलाना चाहता हूं। मैंने कोशिश की है

script.sh | xargs -P8

लेकिन ऊपर वाले ने केवल एक बार ही अमल किया। कोई भाग्य के साथ -8 भी। लूप के लिए स्क्रिप्ट में निष्पादित की जाने वाली पंक्ति के अंत में जोड़ना और स्क्रिप्ट को एक साथ 99 बार चलाने का प्रयास करना होगा। मैं समय पर केवल 8 लूप को कैसे निष्पादित करता हूं, 100 कुल तक।


यही वह है जो मैं शुरू में करना चाहता था, लेकिन मुझे xargs का सहारा लेना पड़ा क्योंकि मैं विंडोज पर हूं। मैं विंडोज पर जीएनयू समानांतर चलने में सक्षम नहीं था
ओलिवियर

क्या वह स्क्रिप्ट खुद को बुला रही है या आपने यहां पूछने पर सिर्फ नामों को भ्रमित किया है?
इटन रिस्नर

क्षमा करें, इसे दूसरी स्क्रिप्ट कहनी चाहिए। मैं इसे ठीक कर दूँगा
ओलिवियर

Stackoverflow.com/questions/3321738/… का उत्तर यहाँ प्रासंगिक है।
इटन रीसनर

जवाबों:


128

से xargsआदमी पेज:

यह मैनुअल पेज xargs के GNU संस्करण को दस्तावेजित करता है। xargs मानक इनपुट से आइटम पढ़ता है, जिसे रिक्त स्थान (जो डबल या सिंगल कोट्स या बैकस्लैश के साथ सुरक्षित किया जा सकता है) या नईलाइनों द्वारा सीमांकित किया जाता है, और कमांड को निष्पादित करता है (डिफ़ॉल्ट / बिन / गूंज है) एक या अधिक बार किसी भी प्रारंभिक-तर्कों के बाद। मानक इनपुट से पढ़ी गई वस्तुओं द्वारा। मानक इनपुट पर खाली लाइनों को अनदेखा किया जाता है।

जिसका अर्थ है कि आपके उदाहरण के लिए xargsआपकी स्क्रिप्ट से सभी आउटपुट का इंतजार करना और एकत्र करना और फिर चलना है echo <that output>। न तो यह सब उपयोगी है और न ही आप क्या चाहते थे।

-nतर्क कैसे इनपुट से कई मदों प्रत्येक आदेश (यहां कुछ भी नहीं है, अपने आप में, समानांतरवाद के बारे में) चलाने हो जाता है के साथ उपयोग करने के लिए है।

आपके साथ जो आप करना चाहते xargsहैं, उसे करने के लिए आपको ऐसा कुछ करने की आवश्यकता होगी:

printf %s\\n {0..99} | xargs -n 1 -P 8 script-to-run.sh input/ output/

जो इस तरह टूट जाता है।

  • printf %s\\n {0..99}- से प्रति-पंक्ति एक नंबर प्रिंट 0करने के लिए 99
  • Daud xargs
    • लेने के ज्यादा से ज्यादा प्रति रन कमांड लाइन एक तर्क
    • और एक समय में आठ प्रक्रियाओं तक चलता है

7
वास्तव में आपको अलग-अलग लाइनों पर तर्क रखने की आवश्यकता नहीं है; शब्द शब्द-विभाजन। तो echo {0..99} |बस के रूप में अच्छी तरह से काम करेगा। <<<{0..99}काम करने के लिए प्रतीत नहीं होता; हालाँकि <<<wordइसे ब्रेस-एक्सपेंसिंग शब्द के रूप में प्रलेखित किया गया है, लेकिन यह मेरे द्वारा किए गए बैश के किसी भी संस्करण के साथ ऐसा नहीं करता है।
रिची

1
@rici एक डॉक्यूमेंट बग की तरह दिखता है, खासतौर पर डॉक्यूमेंटेशन के लिए क्योंकि यहां डॉक्युमेंट्स में ब्रेस एक्सपेंशन का जिक्र नहीं है (और यह किसी भी तरह के क्विक टेस्ट में भी नहीं होता है) हालांकि वे टिल्ड एक्सपैंशन का भी जिक्र नहीं करते हैं (जो ऐसा नहीं होता है) के लिए <<लेकिन ऐसा करता <<<है *shrug*)। यहाँ डॉक्स और यहाँ के स्ट्रिंग्स में जो विस्तार और घटित होते हैं, वे मेरे दिमाग के लिए थोड़े अजीब हैं।
इटन रीसनर

1
उदाहरण के लिए अलग-अलग रन से आप कैसे अलग कर सकते हैं?
निर्वाण-सू ०

3
डेमो: time head -12 <(yes "1") | xargs -n1 -P4 sleep12 sleep 1कमांड चलाएगा , 4 समानांतर। कमांड को 3 सेकंड का समय लगेगा।
वाल्टर ए

66

GNU समानांतर के साथ आप क्या करेंगे:

parallel script-to-run.sh input/ output/ {} ::: {0..99}

-P8यदि आप प्रति सीपीयू कोर में एक नौकरी नहीं चलाना चाहते हैं तो इसमें जोड़ें ।

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

GNU समानांतर एक सामान्य समांतरक है और इससे एक ही मशीन पर या आपके द्वारा उपयोग की जाने वाली कई मशीनों पर समानांतर रूप से कार्य चलाना आसान हो जाता है।

यदि आपके पास 32 अलग-अलग नौकरियां हैं जिन्हें आप 4 सीपीयू पर चलाना चाहते हैं, तो समानांतर करने के लिए एक सीधा आगे का तरीका प्रत्येक सीपीयू पर 8 नौकरियों को चलाना है:

सरल समय-निर्धारण

जीएनयू समानांतर इसके बजाय एक नई प्रक्रिया को जन्म देता है जब एक खत्म हो जाता है - सीपीयू को सक्रिय रखना और इस तरह समय की बचत करना:

GNU समानांतर शेड्यूलिंग

स्थापना

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

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 67bd7bc7dc20aff99eb8f1266574dadb
12345678 67bd7bc7 dc20aff9 9eb8f126 6574dadb
$ md5sum install.sh | grep b7a15cdbb07fb6e11b0338577bc1780f
b7a15cdb b07fb6e1 1b033857 7bc1780f
$ sha512sum install.sh | grep 186000b62b66969d7506ca4f885e0c80e02a22444
6f25960b d4b90cf6 ba5b76de c1acdf39 f3d24249 72930394 a4164351 93a7668d
21ff9839 6f920be5 186000b6 2b66969d 7506ca4f 885e0c80 e02a2244 40e8a43f
$ bash install.sh

अन्य संस्थापन विकल्पों के लिए देखें 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


19
यह सवाल का जवाब नहीं देता है, न ही यह बताता है कि क्यों xargs एक ही चीज़ हासिल नहीं कर सकते हैं।

8
downvote क्योंकि मेरे लिए xarg दूसरी तस्वीर शो के समान है।
noonex

3
@ क्या आप जानते हैं कि हर कोई आपके द्वारा उपयोग किए जाने वाले xargs के संस्करण का उपयोग नहीं करता है और वह -2 xargs के सभी संस्करणों में नहीं है?
ओले तांगे

19
शायद सभी इस बात से अवगत नहीं हैं कि यह उत्तर जीएनयू के लेखक द्वारा दिया गया है।
izkeros

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