मल्टी-थ्रेडिंग / फोर्किंग इन द बैश स्क्रिप्ट


9

मैंने एक बैश स्क्रिप्ट लिखी है जो निम्नलिखित प्रारूप में है:

#!/bin/bash
start=$(date +%s)
inFile="input.txt"
outFile="output.csv"

rm -f $inFile $outFile

while read line
do

    -- Block of Commands

done < "$inFile"

end=$(date +%s)

runtime=$((end-start))

echo "Program has finished execution in $runtime seconds."

whileपाश से पढ़ा जाएगा $inFile, रेखा पर कुछ अभ्यास को पूरा और में परिणाम डंप $outFile

$inFile3500+ लाइनों के रूप में , स्क्रिप्ट पूरी तरह से निष्पादित करने में 6-7 घंटे लगेंगे। इस समय को कम करने के लिए, मैं इस स्क्रिप्ट में मल्टी-थ्रेडिंग या फोर्किंग का उपयोग करने की योजना बना रहा हूं। यदि मैं 8 बाल प्रक्रियाएँ बनाता हूँ, तो एक साथ 8 पंक्तियों को $inFileसंसाधित किया जाएगा।

यह कैसे किया जा सकता है?


सावधान रहें: विभिन्न लिपियों को अलग-अलग संगठनों के लिए लिखना होगा । लिखित रूप में आपकी स्क्रिप्ट भी पहली कार्रवाई के रूप में इनपुट फ़ाइल को हटा देती है!
pjc50

जवाबों:


10

जीएनयूparallel सिर्फ इसी तरह की चीज के लिए बनाया गया है। आप अपनी स्क्रिप्ट को एक साथ कई बार चला सकते हैं, आपके इनपुट के अलग-अलग डेटा के साथ हर एक के लिए पाइप:

cat input.txt | parallel --pipe your-script.sh

डिफ़ॉल्ट रूप से यह आपके सिस्टम पर प्रोसेसर की संख्या के अनुसार प्रक्रियाओं को फैलाएगा, लेकिन आप इसके साथ अनुकूलित कर सकते हैं -j N

एक विशेष रूप से साफ-सुथरी चाल है जिसमें शेबंग-रैपिंग की सुविधा है। यदि आप अपनी बैश स्क्रिप्ट की पहली पंक्ति को इसमें बदलते हैं:

#!/usr/bin/parallel --shebang-wrap --pipe /bin/bash

और इसे मानक इनपुट पर डेटा खिलाएं तो यह सब अपने आप हो जाएगा। यह कम उपयोगी है जब आपके पास सफाई कोड होता है जिसे अंत में चलाना होता है, जो आप कर सकते हैं।

ध्यान देने योग्य बातें हैं। एक यह है कि यह आपके इनपुट को अनुक्रमिक विखंडू में काट देगा और एक बार में उन का उपयोग करेगा - यह लाइनों को इंटरलेव नहीं करता है। दूसरा यह है कि यह उन टुकड़ों को आकार से विभाजित किया जाता है, बिना इस बात की परवाह किए कि कितने रिकॉर्ड हैं। आप --block Nबाइट्स में एक अलग ब्लॉक आकार सेट करने के लिए उपयोग कर सकते हैं । आपके मामले में, फ़ाइल आकार के आठवें भाग से अधिक सही नहीं होना चाहिए। आपकी फ़ाइल की तरह लगता है कि यह एक ब्लॉक में सभी को समाप्त करने के लिए काफी छोटा हो सकता है अन्यथा, जो उद्देश्य को हरा देगा।

विशेष रूप से अलग-अलग उपयोग के मामलों के लिए बहुत सारे विकल्प हैं, लेकिन ट्यूटोरियल चीजों को बहुत अच्छी तरह से कवर करता है। विकल्पों में आप भी शामिल हो सकते हैं --round-robinऔर रुचि रखते हैं --group


1
आपने उस शेबंग लाइन का परीक्षण किया था? कई तर्कों के साथ शेबंग अनपोर्टेबल हैं। लिनक्स पर, #!a b cपरिणाम होगा ["b c"], जबकि कुछ अन्य प्रणालियों पर, इसका परिणाम होगा ["b", "c"]
nyuszika7h

1
यह इस तरह से उपयोग किए जाने पर अपने स्वयं के तर्कों को दोहराता है (अन्यथा विकल्प बहुत उपयोग नहीं होगा)।
माइकल होमर

@MichaelHomer मुझे GNU parallelHTML पृष्ठों के स्क्रैपिंग के लिए उपयोग करने की आवश्यकता है । क्या आप कृपया इस धागे के माध्यम से जा सकते हैं। unix.stackexchange.com/questions/277609/…
Swatesh Pakhare
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.