xargs

2015-02-06 6 views
36

का उपयोग कर समानांतर में प्रोग्राम चलाना वर्तमान में वर्तमान स्क्रिप्ट है।xargs

#!/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 तक।

+4

उपयोग जीएनयू समानांतर – Barmar

+0

है यही कारण है कि मैं शुरू में करना चाहता था, लेकिन xargs का सहारा लेना क्योंकि मैं विंडोज पर कर रहा हूँ था। मैं विंडोज – Olivier

+0

पर जीएनयू समानांतर चलने में सक्षम नहीं था क्या वह स्क्रिप्ट स्वयं कॉल कर रही है या आपने यहां पूछा था जब आपने नामों को भ्रमित कर दिया था? –

उत्तर

50

xargs आदमी पृष्ठ से:

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

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

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

आप इस (untested) की तरह अधिक कुछ करने की आवश्यकता होगी क्या आप xargs साथ चाहते करने के लिए:

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

कौन इस तरह टूट जाती है।

  • printf %s\\n {0..99} - 0 से 99 के प्रति पंक्ति एक संख्या मुद्रित करें।
  • भागो xargs
    • एक समय में आठ प्रक्रियाओं पर निर्भर पर सबसे प्रति रन कमांड लाइन एक तर्क
    • और चलाने लेने
+3

असल में आपको अलग-अलग लाइनों पर तर्क डालने की आवश्यकता नहीं है; xargs शब्द-विभाजन। तो 'echo {0..99} | 'भी काम करेगा। '<<< {0..99} 'काम नहीं लग रहा है; हालांकि '<<< शब्द 'को ब्रेस-विस्तार करने वाले शब्द के रूप में दस्तावेज किया गया है, यह ऐसा नहीं है जो बैश के किसी भी संस्करण के साथ मेरे पास आसान है। – rici

+1

@rici एक प्रलेखन बग की तरह दिखता है, खासकर जब यहां दस्तावेज़ों के लिए प्रलेखन * ब्रेस विस्तार का उल्लेख नहीं करता है (और यह या तो त्वरित परीक्षण में नहीं होता है) हालांकि वे टिल्ड विस्तार का भी उल्लेख नहीं करते हैं (जो नहीं करता '<<' के लिए नहीं होता है, लेकिन '<<<' के लिए होता है * * shrug * ')। यहां विस्तार और डॉक्स में नहीं होने वाले विस्तार और यहां तार मेरे दिमाग में थोड़ा अजीब हैं। –

+0

उदाहरण के साथ आप अलग-अलग रनों से परिणाम कैसे अलग कर सकते हैं नई-पंक्तियों? –

35
जीएनयू साथ

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

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

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

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

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

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

टट के माध्यम से चलो orial: समर्थन प्राप्त करने के ईमेल सूची के लिए http://www.gnu.org/software/parallel/parallel_tutorial.html

साइन अप करें: https://lists.gnu.org/mailman/listinfo/parallel

+8

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

+2

डाउनवोट क्योंकि मेरे लिए xarg बिल्कुल दूसरी तस्वीर दिखाता है। – noonex

+0

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

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