मैं लूप करते समय इसके लिए जीएनयू समानांतर का उपयोग कैसे करूंगा?


12

इसलिए मेरे पास कुछ समय है:

cat live_hosts | while read host; do \
    sortstuff.sh -a "$host" > sortedstuff-"$host"; done

लेकिन इसमें लंबा समय लग सकता है। मैं लूप करते समय इसके लिए जीएनयू समानांतर का उपयोग कैसे करूंगा?

जवाबों:


13

आप एक समय लूप का उपयोग नहीं करते।

parallel "sortstuff.sh -a {} > sortedstuff-{}" <live_hosts

ध्यान दें कि यह आपके live_hosts(जैसे /some/dir/file) पथ के रूप में काम नहीं करेगा क्योंकि इसका विस्तार sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file(जिसके परिणामस्वरूप no such file or directory) होगा; उन मामलों के लिए उपयोग करें {//}और {/}( विवरण के लिए gnu-parallelमैनुअल देखें):

parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts

यह उपयोग करना संभव है teeके साथ parallelजब में उत्पादन डाल sortedstuff? इसलिए मैं आउटपुट को देख सकता हूं क्योंकि यह चलता है।
— सर्वहारा

1
@Proletariat - आप टर्मिनल पर भी आउटपुट करना चाहते हैं? बस की जगह >के साथ | teeजैसे पहले आदेश हो जाता है parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
— don_crissti

3

एक पुराने स्कूल के रूप में "एक काम करो और इसे अच्छी तरह से करो" यूनिक्स आदमी, मैं स्ट्रिंग प्रतिस्थापन सामान को एक रैपर स्क्रिप्ट में डालूंगा:

#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"

यदि आप इसे कहते हैं wrapper.sh, तो parallelइसे कॉल करने का आदेश होगा:

parallel wrapper.sh < live_hosts

ध्यान दें कि आपको catइस तरह की चीज़ की आवश्यकता नहीं है, जो एक बाहरी कार्यक्रम आह्वान को बचाता है।


2

आप की जरूरत नहीं है parallel , क्योंकि पाश का शरीर पिछले पुनरावृत्तियों पर निर्भर नहीं करता है। बस प्रत्येक होस्ट के लिए एक नई पृष्ठभूमि प्रक्रिया शुरू करें।

while read host; do
    sortstuff.sh -a "$host" > sortedstuff-"$host" &
done < live_hosts
wait    # Optional, to block until the background tasks are done

parallelहालांकि कुछ पहलुओं को प्रबंधित करना आसान बनाता है; आप समानांतर में चलने वाली नौकरियों की संख्या को अधिक आसानी से सीमित कर सकते हैं।


3
यदि wc -l live_hostsडिस्क स्पिंडल या सीपीयू कोर की संख्या से अधिक है - इस पर निर्भर करता है कि कार्य I / O या CPU-बाउंड है - तो आप इस तरह के समाधान के साथ समानता से मिलने वाले लाभ को खा सकते हैं। parallelनौकरियों की संख्या को सीमित करने की क्षमता सिर्फ अच्छी नहीं है, यह निकट-आवश्यक है, यदि प्रसंस्करण गति आपका लक्ष्य है।
— वॉरेन यंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.