সমান্তরালভাবে পাইপযুক্ত আদেশগুলি কার্যকর করা


16

নিম্নলিখিত পরিস্থিতি বিবেচনা করুন। আমি দুটি প্রোগ্রাম এ এবং বি প্রোগ্রাম আউটপুট স্ট্রড লাইনের স্ট্রিংয়ের আউটপুটগুলি যখন প্রোগ্রাম বি স্টাডিন থেকে প্রসেস লাইন। এই দুটি প্রোগ্রাম ব্যবহার করার উপায় অবশ্যই:

foo @ বার: ~ $ এ | বি

এখন আমি লক্ষ্য করেছি যে এটি কেবল একটি কোর খায়; তাই আমি ভাবছি:

প্রোগ্রামগুলি এ এবং বি একই কম্পিউটারের সংস্থানগুলি ভাগ করছে? যদি তা হয় তবে এ এবং বি একযোগে চালানোর কোনও উপায় আছে কি?

আরেকটি জিনিস যা আমি লক্ষ্য করেছি যে এ বি এর চেয়ে অনেক বেশি দ্রুত রান করে, তাই আমি ভাবছি যে যদি কোনওভাবে আরও বি প্রোগ্রাম চালানো যায় এবং তাদের সমান্তরালভাবে আউটপুটগুলির লাইনগুলি প্রসেস করা যায়।

যে, এ তার লাইন আউটপুট হবে, এবং প্রোগ্রাম বি এর এন উদাহরণস্বরূপ যে এই লাইনগুলি পড়বে (যারা প্রথমে তাদের পড়তে পারে) তাদের প্রক্রিয়া করে এবং স্টাডআউটগুলিতে আউটপুট দেয়।

সুতরাং আমার চূড়ান্ত প্রশ্নটি হ'ল:

সম্ভাব্যভাবে উত্থাপিত হতে পারে এমন জাতিগত পরিস্থিতি এবং অন্যান্য অসঙ্গতিগুলির যত্ন না নিয়েই বেশ কয়েকটি বি প্রক্রিয়াগুলির মধ্যে আউটপুট এটিকে পাইপ করার কোনও উপায় আছে কি?


1
A | B | Cপৃথক প্রক্রিয়াগুলির মতো সমান্তরাল হলেও পাইপগুলির প্রকৃতির কারণে (বি এ এর ​​আউটপুট জন্য অপেক্ষা করতে হবে, সি বি এর আউটপুট জন্য অপেক্ষা করতে হবে) এটি এখনও কিছু ক্ষেত্রে লিনিয়ার হতে পারে। এটি সম্পূর্ণরূপে নির্ভর করে যে তারা কী ধরণের আউটপুট উত্পাদন করে। এমন অনেকগুলি ঘটনা নেই যেখানে একাধিক চলমান অনেক Bসাহায্য করবে, সম্পূর্ণভাবে সম্ভব যে সমান্তরাল ডাব্লুসিটি উদাহরণটি নিয়মিত তুলনায় ধীর হয় wcকারণ বিভাজন সাধারণত লাইন গণনার চেয়ে আরও বেশি সংস্থান গ্রহণ করতে পারে। যত্ন সহকারে ব্যবহার করুন।
frostschutz

উত্তর:


14

এর সাথে একটি সমস্যা split --filterহ'ল আউটপুটটি মিশ্রণ করা যায়, তাই আপনি প্রক্রিয়া 1 থেকে অর্ধ লাইন এবং তারপরে প্রক্রিয়া 2 থেকে অর্ধ লাইন পাবেন।

জিএনইউ সমান্তরাল গ্যারান্টি দেয় যে কোনও মিশ্রণ হবে না।

সুতরাং ধরুন আপনি করতে চান:

 A | B | C

তবে এটি বি ভীষণ ধীর গতির এবং আপনি এটির সমান্তরাল করতে চান। তারপরে আপনি এটি করতে পারেন:

A | parallel --pipe B | C

জিএনইউ সমান্তরাল ডিফল্টরূপে বিভক্ত \ n এবং একটি ব্লক আকার 1 এমবি। এটি --recend এবং - block এর সাথে সামঞ্জস্য করা যায়।

আপনি জিএনইউ সমান্তরাল সম্পর্কে আরও জানতে পারেন: http://www.gnu.org/s/parallel/

আপনি এর সাথে মাত্র 10 সেকেন্ডের মধ্যে জিএনইউ সমান্তরাল ইনস্টল করতে পারেন:

wget -O - pi.dk/3 | sh 

ইন্ট্রো ভিডিওটি http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1 এ দেখুন


1
যদিও আমি ইনস্টলেশন পদ্ধতির উপর দৃ strongly়ভাবে একমত নই :-), +1 কারণ আপনার সমাধানটি আমার বেশিরভাগ সমস্যার সমাধান করে।
এলসার্নি

এই সত্যিই দুর্দান্ত। পরামিতিগুলি ব্যবহার করার জন্য আপনার কি কোনও পরামর্শ আছে? আমি জানি প্রোগ্রাম এ প্রতি মিনিটে আনুমানিক 5GB ডেটা 1TB এর বেশি আউটপুট দেবে। প্রোগ্রাম বি এ আউটপুটগুলির চেয়ে 5 গুণ ধীরে ধীরে ডেটা প্রসেস করে এবং এই কাজের জন্য আমার কাছে 5 টি কোর রয়েছে।
জের্নেজ

জিএনইউ সমান্তরাল বর্তমানে প্রায় 100 এমবি / সেকেন্ডের প্রায়শই পরিচালনা করতে পারে, তাই আপনি সেই সীমাটি স্পর্শ করতে চলেছেন। অনুকূল--block-size র‌্যামের পরিমাণ এবং আপনি কীভাবে একটি নতুন শুরু করতে পারবেন তার উপর নির্ভর করবে B। আপনার পরিস্থিতিতে আমি ব্যবহার করব --block 100Mএবং দেখব যে এটি কীভাবে সম্পাদিত হয়েছিল।
ওলে টাঞ্জ

@ লেসারনি আপনি কি এমন একটি ইনস্টলেশন পদ্ধতিটি নিয়ে আসতে পারেন যা আরও ভাল, যা বেশিরভাগ ইউনিক্স মেশিনে কাজ করে এবং ব্যবহারকারীর কাছ থেকে একই পরিমাণ কাজ প্রয়োজন?
ওলে টাঞ্জ

4
দুঃখিত, আমি নিজেকে পরিষ্কার করিনি। ইনস্টলেশন পদ্ধতি - স্ক্রিপ্টটি পাস হয়েছে sh- দুর্দান্ত। সমস্যাটি এটিকে শেরে পাস করার মধ্যে রয়েছে: কোনও সাইট থেকে এক্সিকিউটেবল কোড ডাউনলোড করা এবং চালানো । মনে মনে রাখবেন, সম্ভবত আমি খুব বেশি ভৌতিক হয়ে যাচ্ছি, যেহেতু কেউ আপত্তি করতে পারে যে একটি কাস্টম-তৈরি আরপিএম বা ডিইবি মূলত একই জিনিস, এমনকি একটি পৃষ্ঠায় কোডটি অনুলিপি করা এবং আটকানোও এর ফলে লোকেরা অন্ধভাবে কাজ করবে যাহাই হউক না কেন।
এলসার্নি

13

আপনি যখন লিখবেন 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(অথবা সাধারণভাবে পাইপ) পারে ভাল এটি অধিকারী না হতে।


আকর্ষণীয় যে উবুন্টুতে যে বিভাজনটি পাওয়া গেছে তাতে - ফিল্টার বিকল্প নেই। কোন ধরণের ওএস এর জন্য ব্যবহার করছে?
জের্নেজ

লিনাক্স ওপেনসুএসই 12.3, কোরটিলস সহ ( gnu.org/software/coreutils/manual/html_node/… )। আমি চেষ্টা করব এবং একটি উবুন্টু ধরে ফেলব, তারা সম্ভবত কিছু একই নামযুক্ত সরঞ্জামের জন্য নাম পরিবর্তন করে থাকতে পারে।
এলসার্নি

আপনি কি split --filterবিকল্পটি অনুপস্থিত সম্পর্কে নিশ্চিত ? আমার উবুন্টু 12.04-এলটিএসে ("হুইজি / সিড") আছে, এবং আমার উদাহরণগুলি কাজ করে। আপনি কি splitজিএনইউ কোর্টিলের চেয়ে আলাদা ইনস্টল করতে পারতেন ?
এলসার্নি

এর জন্য ধন্যবাদ. আমাকে কোরিটিলসের একটি নতুন সংস্করণ ইনস্টল করতে হয়েছিল। বিটিডাব্লু, আমি লক্ষ করেছি যে আমি যদি প্রোগ্রাম এ চালাই তবে একা এটি পুরো কোর খায় (100%) আমি এ চালিয়ে দিই | বি তারপর তারা একসাথে একটি সম্পূর্ণ কোর খায়, প্রক্রিয়াটি একটি খাওয়া 15% এবং প্রসেস বি খাবে 85% .. আপনি কেন ঘটছেন তা দেখতে পাচ্ছেন?
জের্নেজ

2
এটি সম্ভবত অবরুদ্ধ হওয়ার কারণে । বি যদি এ এর ​​চেয়ে বেশি ভারী হয় তবে এ এর ​​আউটপুট প্রেরণ করতে পারে না এবং ধীর হয়ে যায়। আর একটি সম্ভাবনা হ'ল এটির কাজকালে বি-তে ফলন (উদাঃ ডিস্ক / নেট) / অন্য কোনও সিস্টেমে আপনি দেখতে পাবেন যে সি পিইউ 1 এর 100% এবং এ সিপিইউ-এর 18% নির্ধারিত হচ্ছে go একক কোরকে পরিপূর্ণ করার জন্য আপনার একক উদাহরণ পাওয়ার জন্য সম্ভবত 85/15 ~ 5.67 = খ এর 5 থেকে 6 টির মধ্যে। আই / ও, যদি উপস্থিত থাকে তবে এই মানগুলি স্কু করতে পারে।
এলসার্নি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.