কীভাবে সমান্তরাল প্রক্রিয়াগুলি চালাবেন এবং উভয় সমাপ্ত হলে ফলাফলগুলি একত্রিত করবেন


17

আমার একটি বাশ শেল স্ক্রিপ্ট রয়েছে যাতে আমি প্রায় 5 বা 6 টি বিভিন্ন প্রোগ্রামের মাধ্যমে কিছু তথ্য পাইপ করি তারপরে চূড়ান্ত ফলাফলটি একটি ট্যাব সীমিত ফাইলের মধ্যে ফেলে।

আমি তখন পৃথক অনুরূপ ডেটাसेट এবং দ্বিতীয় ফাইলটিতে আউটপুট দেওয়ার জন্য আবার এটি করি।

তারপরে উভয় ফাইলই তুলনামূলক বিশ্লেষণের জন্য অন্য প্রোগ্রামে ইনপুট হয়। যেমন সরল করা

Data1 | this | that |theother | grep |sed | awk |whatever > Data1Res.csv
Data2 | this | that |theother | grep |sed | awk |whatever > Data2Res.csv
AnalysisProg -i Data1res.csv Data2res.csv

আমার প্রশ্ন: আমি কীভাবে একই সাথে স্টেপ 1 এবং স্টেপ 2 রান করতে পারি (উদাহরণস্বরূপ ব্যবহার &) তবে উভয়ই সম্পূর্ণ হয়ে গেলে কেবল স্টিপি 3 (অ্যানালাইসিসপ্রোগ) চালু করতে পারি?

ধন্যবাদ

Anal এনালাইসিসপ্রোগ কোনও স্ট্রিম বা ফিফোতে কাজ করবে না।



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

পার্ল..এমন কিছু নেই, নয় :(
স্টিফেন হেন্ডারসন

1
এখানে আমি পাইপগুলি জুড়ে কীভাবে ইনপুট বিভক্ত করতে teeএবং এটি দুটি সমবর্তী grepপ্রক্রিয়াগুলির সাথে প্রসেস করব তা দেখিয়েছি
মাইকজার্ভ

এবং এখানে আমি দেখিয়েছি যে কোনও প্রক্রিয়াটিকে পুরোপুরি ব্যাকগ্রাউন্ডে রাখার জন্য সহজ শেল কনস্ট্রাক্টসগুলি কীভাবে ব্যবহার করা যায় nohupতবে এখনও প্রক্রিয়াটির সাথে যোগাযোগের মাধ্যম বজায় রাখতে পারে: unix.stackexchange.com/questions/121253/…
মাইকজারভ

উত্তর:


27

ব্যবহার wait। উদাহরণ স্বরূপ:

Data1 ... > Data1Res.csv &
Data2 ... > Data2Res.csv &
wait
AnalysisProg

ইচ্ছাশক্তি:

  • ব্যাকগ্রাউন্ড জব হিসাবে ডেটা 1 এবং ডেটা 2 পাইপগুলি চালান
  • তাদের উভয় শেষ করার জন্য অপেক্ষা করুন
  • বিশ্লেষণপ্রোগ চালান run

দেখুন, উদাহরণস্বরূপ, এই প্রশ্ন


থেক্স, ভাল লাগছে। উপরের কাজ না করলে আমি এটি চেষ্টা করব।
স্টিফেন হেন্ডারসন

ধন্যবা আবার আমি অপেক্ষা সচেতন ধরনের ছিল কিন্তু googled থাকার একটু কিভাবে এটি বিভিন্ন PID, ইত্যাদি .. আমি মনে হাবা সঙ্গে কাজ করার জন্য বিশৃঙ্খলা শুরু হয়ে গিয়েছিল কিন্তু এখন দেখতে পাচ্ছি এটা শুধু "অপেক্ষার" হয়
স্টিফেন হেন্ডারসন

12

আপনার কাছে কেবল ২ টি ফাইল থাকলে সিএক্সডাব্লু এর উত্তরটি অবশ্যই সন্দেহজনকতর সমাধান is 2 টি ফাইল যদি উদাহরণ হিসাবে থাকে এবং বাস্তবে আপনার 10000 ফাইল থাকে তবে '&' সমাধানটি কার্যকর হবে না কারণ এটি আপনার সার্ভারকে ওভারলোড করে। তার জন্য আপনার জিএনইউ সমান্তরালের মতো একটি সরঞ্জাম প্রয়োজন:

ls Data* | parallel 'cat {} | this | that |theother | grep |sed | awk |whatever > {}res.csv
AnalysisProg -i *res.csv

জিএনইউ সমান্তরাল সম্পর্কে আরও জানতে:

  • দ্রুত পরিচয়ের জন্য ইন্ট্রো ভিডিওটি দেখুন: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
  • টিউটোরিয়াল (ম্যান প্যারালাল_ টিউটোরিয়াল) দিয়ে যান। আপনি কমান্ড লাইন এটির জন্য আপনাকে ভালবাসবে।

হাই থেক্স এই মুহুর্তে আমার কাছে দুটি ফাইল রয়েছে তবে আমার 24 টি প্রসেসর রয়েছে তাই আমি একবারে অনেকগুলি চেষ্টা করে চালানোর লোভ বোধ করছিলাম - যদিও কোনও কম্পিউটিং বিজ্ঞানের ব্যক্তি হিসাবে আমি অস্পষ্ট না যে ডিস্ক রিডিংয়ের বাধা এটি সার্থক করে তুলবে কিনা ar সম্ভবত আমি এটি স্তন্যপান করব এবং দেখুন;)
স্টিফেন হেন্ডারসন

@ স্টেফেনহেন্ডারসন আকারের উপর নির্ভর করে ফাইলগুলি এখনও ক্যাশে থাকতে পারে। যদি গতির সমালোচনা হয় তবে আপনি কেবল tmpfs ব্যবহার করতে পারেন (এবং ফাইলগুলি <<< তবে আপনার র‌্যাম)।
ম্যাকিয়েজ পাইচোটকা

1
@ স্টেফেনহেন্ডারসন সমান্তরাল কাজের সংখ্যা -j এর সাথে সামঞ্জস্য করা যায়, তাই -j4 চেষ্টা করুন এবং সার্ভার যদি ওভারলোড না করে তবে -j6 ইত্যাদি চেষ্টা করুন তবে সিটিআরএল-সি চাপতে প্রস্তুত থাকুন: জিএনইউ সমান্তরাল সার্ভারগুলি দ্রুত ওভারলোড করার জন্য একটি দুর্দান্ত সরঞ্জাম । - লোড এ একবার দেখুন।
ওলে টাঞ্জ

1

এটি করার একটি উপায় এর মতো দেখতে কিছু দেখতে পাবে:

AnalysisProg <<PREPROCESS /dev/stdin
$( 
{   process1=$( pipe | line | 1 >&2 & echo $! )
    process2=$( pipe | line | 2 >&2 & echo $! )
    while ps -p $process1 $process2 >/dev/null; do
        sleep 1
    done
} 2>&1
)
#END
PREPROCESS

এইভাবে আপনি উভয় পাইপলাইনের ব্যাকগ্রাউন্ড করেছেন তবে তারপরে স্টিডিনের সাথে তাদের আউটপুট সংযুক্ত করার আগে তাদের সম্পাদন শেষ করার জন্য অপেক্ষা করুন যা এখানে-নথিতে মূল্যায়ন করা হয় এবং বিশ্লেষণপ্রোগের কাছে হস্তান্তর করা হয়। আপনি যদি এটি ব্যবহার করতে পারেন waitতবে while psলুপের চেয়েও ভাল , তবে, শেল নির্ভর করে waitযদি আপনি এটি এমন কোনও প্রক্রিয়াটির জন্য অপেক্ষা করতে নির্দেশ দেন যা বর্তমান শেলের শিশু নয়।

এছাড়াও নোট করুন যে উপরের পদ্ধতিটি আউটপুট কল্ট করবে - সুতরাং উভয় প্রক্রিয়া একবারে লেখা হবে। আপনি যদি পরিবর্তে সেগুলি আলাদা করতে চান বা অন্যকে সংযুক্ত করে থাকেন তবে আপনি করতে পারেন:

AnalysisProg 3<<PREPROCESS /dev/fd/3 /dev/stderr
$(
process1=$(... >&2 ...) 2>/dev/fd/3
...
} 3>/dev/fd/3 2>/dev/stderr
)

আমি এই ধারণাগুলি আগেও প্রদর্শন করেছি। সম্ভবত সেরা ডেমো এখানে এবং এখানে রয়েছে


0

এটি ব্যবহার করার চেষ্টা করুন।

rm -f Data1Res.csv
rm -f Data2Res.csv
Data1 | this | that |theother | grep |sed | awk |whatever > Data1Res.csv &
Data2 | this | that |theother | grep |sed | awk |whatever > Data2Res.csv &
while true
do
  ps aux | grep -v grep | grep -i -E 'Data1Res.csv|Data2Res.csv' &> /dev/null
  if [ $? -ne 0 ]
  then
    AnalysisProg -i Data1res.csv Data2res.csv
    exit 0
  fi
done

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