ব্যাশ স্ক্রিপ্টে মাল্টি-থ্রেডিং / ফোর্কিং


9

আমি একটি বাশ স্ক্রিপ্ট লিখেছি যা নিম্নলিখিত ফর্ম্যাটে রয়েছে:

#!/bin/bash
start=$(date +%s)
inFile="input.txt"
outFile="output.csv"

rm -f $inFile $outFile

while read line
do

    -- Block of Commands

done < "$inFile"

end=$(date +%s)

runtime=$((end-start))

echo "Program has finished execution in $runtime seconds."

whileলুপ থেকে পড়তে হবে $inFile, লাইন কিছু কার্যকলাপ সঞ্চালন করা এবং ফলাফলের ডাম্প $outFile

যেহেতু $inFile3500+ লাইন দীর্ঘ, স্ক্রিপ্টটি সম্পূর্ণরূপে সম্পাদনের জন্য 6-7 ঘন্টা সময় নেয়। এবার কমাতে, আমি এই স্ক্রিপ্টে মাল্টি-থ্রেডিং বা কাঁটাচামচ ব্যবহার করার পরিকল্পনা করছি। আমি যদি 8 টি শিশু প্রসেস তৈরি করি, তবে 8 টি লাইন $inFileএকই সাথে প্রক্রিয়া করা হবে।

কিভাবে এই কাজ করা যেতে পারে?


সতর্কতা অবলম্বন করুন: বিভিন্ন স্ক্রিপ্টগুলির বিভিন্ন আউটফাইলে লিখতে হবে । এছাড়াও লিখিত হিসাবে আপনার স্ক্রিপ্ট প্রথম ক্রিয়া হিসাবে ইনপুট ফাইল মুছে!
pjc50

উত্তর:


10

জিএনইউparallel কেবল এই ধরণের জিনিসটির জন্য তৈরি। আপনি প্রতিটি একের জন্য পাইপযুক্ত আপনার ইনপুট থেকে আলাদা ডেটা সহ একবারে আপনার স্ক্রিপ্ট একবারে চালাতে পারেন:

cat input.txt | parallel --pipe your-script.sh

ডিফল্টরূপে এটি আপনার সিস্টেমে প্রসেসরের সংখ্যা অনুসারে প্রক্রিয়াগুলিকে উত্সাহিত করবে, তবে আপনি এটির সাহায্যে কাস্টমাইজ করতে পারেন -j N

একটি বিশেষ ঝরঝরে কৌশল হ'ল শেবাং-মোড়ানো বৈশিষ্ট্য। আপনি যদি আপনার বাশ স্ক্রিপ্টের প্রথম লাইনটি এতে পরিবর্তন করেন:

#!/usr/bin/parallel --shebang-wrap --pipe /bin/bash

এবং স্ট্যান্ডার্ড ইনপুট এ এটি ডেটা ফিড তারপর তা সব স্বয়ংক্রিয়ভাবে ঘটবে। আপনার ক্লিনআপ কোড রয়েছে যা শেষে চালাতে হবে এটি আপনি কম ব্যবহার করতে পারেন।

এখানে কয়েকটি বিষয় লক্ষণীয়। একটি হ'ল এটি আপনার ইনপুটটিকে অনুক্রমিক অংশগুলিতে কাটাবে এবং একসাথে সেগুলি ব্যবহার করবে - এটি লাইনগুলিকে ইন্টারলিভ করে না। অন্যটি হ'ল এটি খণ্ডগুলি আকার দ্বারা বিভক্ত হয়, সেখানে কতগুলি রেকর্ড রয়েছে তা বিবেচনা না করেই। আপনি --block Nবাইটে আলাদা ব্লকের আকার সেট করতে ব্যবহার করতে পারেন । আপনার ক্ষেত্রে, ফাইল আকারের অষ্টমীর চেয়ে বেশি সঠিক হওয়া উচিত নয়। আপনার ফাইলটি মনে হচ্ছে এটি একটির ব্লকে সমস্ত কিছু শেষ করার পক্ষে যথেষ্ট ছোট হতে পারে, যা উদ্দেশ্যকে পরাস্ত করবে।

নির্দিষ্ট বিভিন্ন ব্যবহারের ক্ষেত্রে প্রচুর বিকল্প রয়েছে তবে টিউটোরিয়ালে জিনিসগুলি বেশ ভালভাবে কভার করা হয়েছে। আপনি আগ্রহী হতে পারে বিকল্পগুলি অন্তর্ভুক্ত --round-robinএবং --group


1
আপনি কি সেই শেবাং লাইনের পরীক্ষা করেছিলেন? একাধিক যুক্তিযুক্ত শেবাংগুলি অপ্রয়োজনীয়। লিনাক্স এ, #!a b cপরিণাম ডেকে আনবে ["b c"], যখন কিছু অন্যান্য সিস্টেমে, এটা হবে ["b", "c"]
nyuszika7h

1
এইভাবে ব্যবহার করার সময় এটি তার নিজস্ব যুক্তি পুনরুদ্ধার করে (অন্যথায় বিকল্পটি খুব বেশি ব্যবহার হবে না)।
মাইকেল হোমার

@ মিশেলহোমর GNU parallelএইচটিএমএল পৃষ্ঠাগুলি স্ক্র্যাপ করার জন্য আমার প্রয়োজন । আপনি কি দয়া করে এই থ্রেডটি দিয়ে যেতে পারেন unix.stackexchange.com/Qestions/277609/…
স্বতেশ পাখারে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.