जब आप लिखते हैं A | B
, तो दोनों प्रक्रियाएं पहले से ही समानांतर में चलती हैं। यदि आप उन्हें केवल एक कोर का उपयोग करते हुए देखते हैं, तो शायद इसलिए कि सीपीयू आत्मीयता सेटिंग्स में से किसी एक (शायद अलग-अलग आत्मीयता के साथ एक प्रक्रिया को स्पॉन करने के लिए कुछ उपकरण है) या क्योंकि एक प्रक्रिया पूरे कोर को धारण करने के लिए पर्याप्त नहीं है, और सिस्टम " पसंद "कंप्यूटिंग को फैलाने के लिए नहीं।
कई बी को एक ए के साथ चलाने के लिए, आपको एक उपकरण की आवश्यकता है जैसे split
कि --filter
विकल्प के साथ :
A | split [OPTIONS] --filter="B"
यह, हालांकि, आउटपुट में लाइनों के क्रम को गड़बड़ाने के लिए उत्तरदायी है, क्योंकि बी नौकरियां सभी एक ही गति से नहीं चल रही होंगी। यदि यह एक समस्या है, तो आपको एक इंटरमीडिएट फ़ाइल में B i-th आउटपुट को रीडायरेक्ट करने और अंत में उन्हें एक साथ उपयोग करने की आवश्यकता हो सकती है cat
। यह, बदले में, एक काफी डिस्क स्थान की आवश्यकता हो सकती है।
अन्य विकल्प मौजूद हैं (उदाहरण के लिए आप एक ही लाइन बफ़र उत्पादन के लिए बी के प्रत्येक उदाहरण के सीमित हो सकती है, जब तक इंतजार एक पूरी बी के के "दौर" समाप्त हो गया है, एक के बराबर चलाने को कम करने के लिए split
की नक्शा , और cat
अस्थायी उत्पादन एक साथ), दक्षता के विभिन्न स्तरों के साथ। उदाहरण के लिए वर्णित 'राउंड' विकल्प B के सबसे धीमे उदाहरण के लिए प्रतीक्षा करेगा , इसलिए यह B के लिए उपलब्ध बफरिंग पर बहुत निर्भर करेगा; [m]buffer
ऑपरेशन क्या हैं, इस पर निर्भर करते हुए, यह मदद कर सकता है या नहीं।
उदाहरण
पहले 1000 नंबर जेनरेट करें और लाइनों को समानांतर में गिनें:
seq 1 1000 | split -n r/10 -u --filter="wc -l"
100
100
100
100
100
100
100
100
100
100
यदि हम लाइनों को "चिह्नित" करने के लिए थे, तो हम देखेंगे कि प्रत्येक पहली पंक्ति को # 1, प्रत्येक पांचवीं पंक्ति को # 5 और इसी तरह संसाधित करने के लिए भेजा जाता है। इसके अलावा, split
दूसरी प्रक्रिया को शुरू करने में लगने वाले समय में , पहले से ही कोटा में एक अच्छा तरीका है:
seq 1 1000 | split -n r/10 -u --filter="sed -e 's/^/$RANDOM - /g'" | head -n 10
19190 - 1
19190 - 11
19190 - 21
19190 - 31
19190 - 41
19190 - 51
19190 - 61
19190 - 71
19190 - 81
जब 2-कोर मशीन पर निष्पादित किया जाता है seq
, split
और wc
प्रक्रियाएं कोर साझा करती हैं; लेकिन करीब देखते हुए, सिस्टम CPU0 पर पहले दो प्रक्रियाओं को छोड़ देता है, और CPU1 को कार्यकर्ता प्रक्रियाओं में विभाजित करता है:
%Cpu0 : 47.2 us, 13.7 sy, 0.0 ni, 38.1 id, 1.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 15.8 us, 82.9 sy, 0.0 ni, 1.0 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5314 lserni 20 0 4516 568 476 R 23.9 0.0 0:03.30 seq
5315 lserni 20 0 4580 720 608 R 52.5 0.0 0:07.32 split
5317 lserni 20 0 4520 576 484 S 13.3 0.0 0:01.86 wc
5318 lserni 20 0 4520 572 484 S 14.0 0.0 0:01.88 wc
5319 lserni 20 0 4520 576 484 S 13.6 0.0 0:01.88 wc
5320 lserni 20 0 4520 576 484 S 13.3 0.0 0:01.85 wc
5321 lserni 20 0 4520 572 484 S 13.3 0.0 0:01.84 wc
5322 lserni 20 0 4520 576 484 S 13.3 0.0 0:01.86 wc
5323 lserni 20 0 4520 576 484 S 13.3 0.0 0:01.86 wc
5324 lserni 20 0 4520 576 484 S 13.3 0.0 0:01.87 wc
विशेष रूप से ध्यान दें कि split
सीपीयू काफी मात्रा में खा रहा है। यह ए की जरूरतों के अनुपात में कमी आएगी; यानी, यदि A की तुलना में भारी प्रक्रिया है seq
, तो सापेक्ष उपरि split
घट जाएगी। लेकिन अगर एक एक बहुत ही हल्के प्रक्रिया है और बी काफी तेज है (ताकि आप कोई जरूरत से ज्यादा 2-3 बी के एक साथ रखने के लिए), तो साथ parallelizing split
(या सामान्य रूप में पाइप) हो सकता है अच्छी तरह से इसके लायक नहीं हो।
A | B | C
अलग-अलग प्रक्रियाओं में समानांतर है, पाइप की प्रकृति के कारण (बी को ए के आउटपुट के लिए इंतजार करना पड़ता है, सी को बी के उत्पादन के लिए इंतजार करना पड़ता है) यह अभी भी कुछ मामलों में रैखिक हो सकता है। यह पूरी तरह से इस बात पर निर्भर करता है कि वे किस तरह का उत्पादन करते हैं। ऐसे कई मामले नहीं हैं, जहां एकाधिक भाग लेनेB
से बहुत मदद मिलेगी, यह पूरी तरह से संभव है कि समानांतर wc उदाहरण नियमितwc
रूप से धीमा हो क्योंकि विभाजन के कारण सामान्य रूप से लाइनों की गिनती की तुलना में अधिक संसाधन हो सकते हैं। देखभाल के साथ उपयोग करें।