আপনি যখন লিখবেন A | B
, উভয় প্রক্রিয়া ইতিমধ্যে সমান্তরালে চলমান। আপনি যদি এগুলিকে কেবল একটি কোর ব্যবহার করে দেখেন তবে এটি সম্ভবত সিপিইউ অ্যাফিনিটি সেটিংসের কারণেই রয়েছে (সম্ভবত কোনও আলাদা অ্যাপ্লিকেশন সহ কোনও প্রক্রিয়া উত্সাহিত করার জন্য কোনও সরঞ্জাম রয়েছে) অথবা একটি প্রক্রিয়া পুরো কোরকে ধরে রাখতে যথেষ্ট নয়, এবং সিস্টেমটি " পছন্দ করে "কম্পিউটিং ছড়িয়ে না পড়া।
বিভিন্ন খ-এর চালানোর জন্য এক একটি সঙ্গে, আপনি যেমন একটি হাতিয়ার প্রয়োজন split
সঙ্গে --filter
বিকল্প:
A | split [OPTIONS] --filter="B"
এটি তবে আউটপুটটিতে লাইনগুলির ক্রমকে জবাবদিহি করতে বাধ্য, কারণ বি জবগুলি একই গতিতে চলবে না। যদি এটি কোনও সমস্যা হয় তবে আপনার প্রয়োজন হতে পারে বি-ই-থপ আউটপুটটিকে একটি মধ্যবর্তী ফাইলে পুনর্নির্দেশ করতে হবে এবং শেষে তাদের একত্রে সেলাই ব্যবহার করতে হবে cat
। এর পরিবর্তে, যথেষ্ট ডিস্কের জায়গার প্রয়োজন হতে পারে।
অন্যান্য বিকল্প বিদ্যমান (যেমন আপনি বি এর প্রতিটি উদাহরণকে একক লাইন-বাফার আউটপুটে সীমাবদ্ধ রাখতে পারতেন, বি এর পুরো "রাউন্ড" শেষ না হওয়া পর্যন্ত অপেক্ষা করুন, এর সমতুল্য চালান কমাতে থেকে split
এর মানচিত্র , এবং cat
অস্থায়ী আউটপুট একসঙ্গে), দক্ষতার বিভিন্ন স্তরের সঙ্গে। উদাহরণস্বরূপ বর্ণিত 'রাউন্ড' বিকল্পটি বি এর সবচেয়ে ধীরতম দৃষ্টান্তটি শেষ হওয়ার জন্য অপেক্ষা করবে , সুতরাং এটি বি এর জন্য উপলব্ধ বাফারিংয়ের উপর নির্ভর করবে; [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
প্রক্রিয়াগুলি করগুলি ভাগ করে দেয়; কিন্তু কাছাকাছি তাকান, সিস্টেমটি সিপিইউ-তে প্রথম দুটি প্রক্রিয়া ছেড়ে দেয় এবং কর্মী প্রসেসগুলির মধ্যে সিপিইউ 1 বিভক্ত করে:
%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
যথেষ্ট পরিমাণে সিপিইউ খাচ্ছে। এটি এ এর প্রয়োজনের অনুপাতে হ্রাস পাবে; অর্থাত্ যদি ক এর চেয়ে ভারী প্রক্রিয়া হয় seq
তবে এর আপেক্ষিক ওভারহেড split
হ্রাস পাবে। কিন্তু যদি একজন একটি খুব লাইটওয়েট প্রক্রিয়া এবং B বেশ দ্রুত হবে (যাতে আপনি কোন প্রয়োজন তুলনায় আরো 2-3 খ এর একটি সহ রাখার), তারপর সঙ্গে parallelizing split
(অথবা সাধারণভাবে পাইপ) পারে ভাল এটি অধিকারী না হতে।
A | B | C
পৃথক প্রক্রিয়াগুলির মতো সমান্তরাল হলেও পাইপগুলির প্রকৃতির কারণে (বি এ এর আউটপুট জন্য অপেক্ষা করতে হবে, সি বি এর আউটপুট জন্য অপেক্ষা করতে হবে) এটি এখনও কিছু ক্ষেত্রে লিনিয়ার হতে পারে। এটি সম্পূর্ণরূপে নির্ভর করে যে তারা কী ধরণের আউটপুট উত্পাদন করে। এমন অনেকগুলি ঘটনা নেই যেখানে একাধিক চলমান অনেকB
সাহায্য করবে, সম্পূর্ণভাবে সম্ভব যে সমান্তরাল ডাব্লুসিটি উদাহরণটি নিয়মিত তুলনায় ধীর হয়wc
কারণ বিভাজন সাধারণত লাইন গণনার চেয়ে আরও বেশি সংস্থান গ্রহণ করতে পারে। যত্ন সহকারে ব্যবহার করুন।