এক্সার্গস ব্যবহার করে সমান্তরালে প্রোগ্রামগুলি চালানো


86

আমার কাছে বর্তমান স্ক্রিপ্ট রয়েছে।

#!/bin/bash
# script.sh

for i in {0..99}; do
   script-to-run.sh input/ output/ $i
done

আমি এটিকে xargs ব্যবহার করে সমান্তরালে চালাতে চাই। আমি চেষ্টা করেছি

script.sh | xargs -P8

তবে উপরোক্ত কাজগুলি একবারে একবার কার্যকর করা হয়েছিল। -N8 এর সাথে ভাগ্যও নেই। লুপের জন্য স্ক্রিপ্টে সম্পাদনের জন্য লাইনটির শেষে & যুক্ত করা একবারে একবারে 99 বার স্ক্রিপ্টটি চালানোর চেষ্টা করবে। আমি 100 টি পর্যন্ত মোট 8 টি লুপটি কীভাবে কার্যকর করব।


আমি প্রথমে এটি করতে চেয়েছিলাম, তবে আমি উইন্ডোজ থাকায় xargs অবলম্বন করতে হয়েছিল। আমি জিএনইউ সমান্তরাল উইন্ডোজে চলতে সক্ষম হইনি
অলিভিয়ার

সেই স্ক্রিপ্টটি নিজেই কল করছে নাকি আপনি এখানে জিজ্ঞাসা করার পরে কেবল নাম গুলিয়ে ফেললেন?
এটান রিজনার

দুঃখিত, এটি অন্য স্ক্রিপ্ট কল করা উচিত। আমি এটি ঠিক করব
অলিভিয়ার

স্ট্যাকওভারফ্লো / প্রশ্নগুলির উত্তর এখানে / 3321738/ … প্রাসঙ্গিক।
এটান রিজনার

উত্তর:


129

থেকে xargsমানুষ পৃষ্ঠা:

এই ম্যানুয়াল পৃষ্ঠাটি xargs এর GNU সংস্করণ নথি করে। xargs স্ট্যান্ডার্ড ইনপুট থেকে আইটেমগুলি পড়ে, ফাঁকা দ্বারা সীমাবদ্ধ (যা ডাবল বা একক উদ্ধৃতি বা একটি ব্যাকস্ল্যাশ দিয়ে সুরক্ষিত করা যেতে পারে) বা নিউলাইনস, এবং পরবর্তী যে কোনও প্রাথমিক আর্গুমেন্ট সহ এক বা একাধিকবার কমান্ডটি (ডিফল্ট / বিন / প্রতিধ্বনি) সম্পাদন করে স্ট্যান্ডার্ড ইনপুট থেকে পড়া আইটেম দ্বারা। স্ট্যান্ডার্ড ইনপুটটিতে ফাঁকা রেখাগুলি এড়ানো হবে।

যার অর্থ আপনার উদাহরণের xargsজন্য অপেক্ষা করছে এবং আপনার স্ক্রিপ্ট থেকে সমস্ত আউটপুট সংগ্রহ করবে এবং তারপরে চলছে echo <that output>। ঠিক যে সমস্ত দরকারী বা আপনি কি চান না।

-nযুক্তি কিভাবে ইনপুট থেকে অনেক আইটেম প্রতিটি কমান্ড যে (এখানে কিছুই নিজে, উপমা সম্বন্ধে) চালানোর পরার সঙ্গে ব্যবহার করার জন্য নয়।

আপনি যা চান xargsতা করতে আপনার আরও কিছু করা দরকার (অনির্ধারিত):

printf %s\\n {0..99} | xargs -n 1 -P 8 script-to-run.sh input/ output/

যা এভাবে ভেঙে যায়।

  • printf %s\\n {0..99}- থেকে প্রতি লাইনে একটি সংখ্যা মুদ্রণ 0করার জন্য 99
  • চালান xargs
    • রান কমান্ড লাইনে সর্বাধিক একটি যুক্তি গ্রহণ করা
    • এবং চালানোর আপ একটি সময়ে আট প্রসেস

8
আসলে আপনার পক্ষে যুক্তিগুলি আলাদা লাইনে রাখার দরকার নেই; xargs শব্দ-বিভক্ত। সুতরাং echo {0..99} |ঠিক পাশাপাশি কাজ করবে। <<<{0..99}কাজ বলে মনে হচ্ছে না; যদিও <<<wordব্রেস-প্রসারণ শব্দের হিসাবে নথিভুক্ত করা হয়েছে তবে এটি আমার হাতে থাকা কোনও বাশের কোনও সংস্করণ দিয়ে তা করে না।
ধনী

4
@rici দেখতে একটি ডকুমেন্টেশন বাগের মতো মনে হচ্ছে বিশেষত যেহেতু এখানে নথির জন্য নথিতে ব্রেস সম্প্রসারণের কথা উল্লেখ করা হয়নি (এবং এটি একটি দ্রুত পরীক্ষায় হয় না) যদিও তারা টিলড সম্প্রসারণের কথাও উল্লেখ করে না (যা ঘটে না জন্য <<তবে <<<তাই করে *shrug*)। এখানে ডক্স এবং এখানে স্ট্রিংগুলিতে যেগুলি ঘটে এবং না ঘটে সেগুলি আমার মনের কাছে কিছুটা বিশ্রী।
এটান রিজনার

4
উদাহরণস্বরূপ নিউলাইনগুলি দিয়ে আপনি কীভাবে বিভিন্ন রান থেকে ফলাফল আলাদা করতে পারবেন?
নির্বান-এমএসু

4
ডেমো: time head -12 <(yes "1") | xargs -n1 -P4 sleep12 টি sleep 1কমান্ড, 4 সমান্তরাল চলবে । কমান্ডটি 3 সেকেন্ড সময় নেবে।
ওয়াল্টার এ

66

GNU সমান্তরাল দিয়ে আপনি কি করবেন:

parallel script-to-run.sh input/ output/ {} ::: {0..99}

আপনি -P8যদি সিপিইউ কোর প্রতি একটি কাজ চালাতে না চান তবে যোগ করুন ।

এর বিপরীতে xargsরাইট থিং করবে, এমনকি ইনপুটটিতে জায়গা থাকলেও, ', বা "(যদিও এটি এখানে নয়, যদিও) এটি বিভিন্ন জব থেকে আউটপুট এক সাথে মিশে না তাও নিশ্চিত করে, তাই আপনি যদি আউটপুট ব্যবহার করেন তবে গ্যারান্টিযুক্ত যে আপনি দুটি ভিন্ন কাজ থেকে অর্ধ-লাইন পাবেন না।

জিএনইউ সমান্তরাল হ'ল একটি সাধারণ প্যারালালাইজার এবং একই মেশিনে বা আপনার একাধিক মেশিনে ssh অ্যাক্সেস থাকা সমান্তরালে কাজ চালানো সহজ।

যদি আপনার কাছে 32 টি আলাদা চাকরি থাকে তবে আপনি 4 টি সিপিইউতে চালাতে চান, সমান্তরাল করার জন্য একটি সরল সামনের উপায় হ'ল প্রতিটি সিপিইউতে 8 টি কাজ চালানো:

সাধারণ সময়সূচী

সিএনইউ সক্রিয় রাখা এবং এভাবে সময় সাশ্রয় করা - জিএনইউ সমান্তরাল পরিবর্তিত হয়ে একটি নতুন প্রক্রিয়া তৈরি করে

জিএনইউ সমান্তরাল শিডিউলিং

স্থাপন

যদি GNU সমান্তরাল আপনার বিতরণের জন্য প্যাকেজ করা না থাকে তবে আপনি একটি ব্যক্তিগত ইনস্টলেশন করতে পারেন, যার রুট অ্যাক্সেসের প্রয়োজন নেই। এটি করে 10 সেকেন্ডের মধ্যে এটি করা যেতে পারে:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 67bd7bc7dc20aff99eb8f1266574dadb
12345678 67bd7bc7 dc20aff9 9eb8f126 6574dadb
$ md5sum install.sh | grep b7a15cdbb07fb6e11b0338577bc1780f
b7a15cdb b07fb6e1 1b033857 7bc1780f
$ sha512sum install.sh | grep 186000b62b66969d7506ca4f885e0c80e02a22444
6f25960b d4b90cf6 ba5b76de c1acdf39 f3d24249 72930394 a4164351 93a7668d
21ff9839 6f920be5 186000b6 2b66969d 7506ca4f 885e0c80 e02a2244 40e8a43f
$ bash install.sh

অন্যান্য ইনস্টলেশন বিকল্পের জন্য দেখুন http://git.savannah.gnu.org/cgit/parallel.git/tree/README

আরও জানুন

আরও উদাহরণ দেখুন: http://www.gnu.org/software/parallel/man.html

পরিচিতি ভিডিওগুলি দেখুন: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

টিউটোরিয়ালটি দেখুন: http://www.gnu.org/software/parallel/paentall_tutorial.html

সমর্থন পেতে ইমেল তালিকার জন্য সাইন আপ করুন: https://lists.gnu.org/mailman/listinfo/parallel


19
এটি প্রশ্নের উত্তর দেয় না বা জার্গাগুলি কেন একই জিনিস অর্জন করতে পারে না তা নির্দেশ করে না।
实 唯

8
ডাউনভোট কারণ আমার জন্য এক্সআরজি ঠিক দ্বিতীয় চিত্রের মতো করে।
noonex

4
@ নুনেক্স আপনি কী জানেন যে সবাই যে জার্গাগুলি ব্যবহার করেন সেগুলি যে সংস্করণ ব্যবহার করে না এবং পি-পিও জার্গসের সমস্ত সংস্করণে নেই?
ওলে টাঞ্জ

20
এই উত্তরটি GNU সমান্তরাল লেখকের দ্বারা সরবরাহ করা হয়েছে তা সম্ভবত সকলেই জানেন না।
izkeros

4
বেশিরভাগ স্ক্রিপ্টগুলিকে গণ্ডগোল করে এমন ইন্টারেক্টিভ প্রম্পটের কারণে প্রথম প্রয়াসে বর্ণিত হিসাবে সঠিকভাবে চালিত হয় না এমন একটি সফটওয়্যারটির স্পষ্ট বিজ্ঞাপনের কারণে ডাউনভোটেড।
ড্যানিয়েল সোরিচেটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.