इसके लिए दो आसान उपाय हैं। मूल रूप से, का उपयोग कर xargs
या parallel
।
xargs दृष्टिकोण:
आप उपयोग कर सकते हैं xargs
के साथ find
इस प्रकार है:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
जहाँ आप number_of_processes
उन अधिकतम प्रक्रियाओं को प्रतिस्थापित करेंगे जिन्हें आप लॉन्च करना चाहते हैं। हालाँकि, यह सुनिश्चित करने की गारंटी नहीं है कि आपका प्रदर्शन I / O सीमित है। जिस स्थिति में आप I / Os के इंतज़ार में खोए समय की भरपाई के लिए अधिक प्रक्रियाएँ शुरू करने का प्रयास कर सकते हैं।
इसके अलावा, खोज को शामिल करने के साथ, आप केवल फ़ाइल पैटर्न के बजाय अधिक उन्नत विकल्प निर्दिष्ट कर सकते हैं, जैसे संशोधन समय, आदि ...
इस दृष्टिकोण के साथ एक संभव मुद्दा जैसा कि स्टीफन की टिप्पणियों द्वारा समझाया गया है, अगर कुछ फाइलें हैं, तो xargs
उनके लिए पर्याप्त रूप से कई प्रक्रियाएं शुरू नहीं हो सकती हैं। एक समाधान यह निर्दिष्ट -n
करने के लिए विकल्प का उपयोग xargs
करना होगा कि एक समय में पाइप से कितने तर्क लेने चाहिए। सेटिंग प्रत्येक एकल फ़ाइल के लिए एक नई प्रक्रिया शुरू करने के लिए -n1
मजबूर करेगी xargs
। यह एक वांछित व्यवहार हो सकता है यदि फाइलें बहुत बड़ी हैं (जैसे कि इस प्रश्न के मामले में) और अपेक्षाकृत कम संख्या में फाइलें हैं। हालाँकि, यदि फ़ाइलें स्वयं छोटी हैं, तो एक नई प्रक्रिया शुरू करने का ओवरहेड समानता के लाभ को कम कर सकता है, इस मामले में एक बड़ा -n
मूल्य बेहतर होगा। इस प्रकार, -n
फ़ाइल आकार और संख्या के अनुसार विकल्प ठीक हो सकता है।
समानांतर दृष्टिकोण:
इसका एक और तरीका है ओले तांगे जीएनयू समानांतर उपकरण का उपयोग करना parallel
, ( यहां उपलब्ध है )। यह समानता पर अधिक अच्छा अनाज नियंत्रण प्रदान करता है और यहां तक कि कई मेजबानों पर वितरित किया जा सकता है (यदि आपकी निर्देशिका उदाहरण के लिए साझा की जाती है तो यह फायदेमंद होगा)। समानांतर का उपयोग करते हुए सबसे सरल वाक्यविन्यास होगा:
find . -type f | parallel -j+1 grep mypattern
जहां विकल्प -j+1
आपकी मशीन पर कोर की संख्या से अधिक एक प्रक्रिया शुरू करने के लिए समानांतर निर्देश देता है (यह I / O सीमित कार्यों के लिए सहायक हो सकता है, आप संख्या में अधिक जाने की कोशिश भी कर सकते हैं)।
समानांतर में xargs
प्रत्येक प्रक्रिया से वास्तव में आउटपुट के क्रम को बनाए रखने और एक सन्निहित उत्पादन उत्पन्न करने पर भी लाभ होता है। उदाहरण के लिए, xargs
यदि प्रक्रिया 1 प्रक्रिया लाइन कहती है p1L1
, तो प्रक्रिया 2 एक पंक्ति उत्पन्न करती है p2L1
, प्रक्रिया 1 दूसरी पंक्ति उत्पन्न करती है p1L2
, आउटपुट होगा:
p1L1
p2L1
p1L2
parallel
आउटपुट के साथ होना चाहिए:
p1L1
p1L2
p2L1
यह आमतौर पर xargs
आउटपुट से अधिक उपयोगी है ।