আমার কাছে তিন ধরণের ডেটা রয়েছে যা বিভিন্ন ফর্ম্যাটে রয়েছে; প্রতিটি ডেটা টাইপের জন্য একটি পাইথন স্ক্রিপ্ট রয়েছে যা এটিকে একক ইউনিফাইড বিন্যাসে রূপান্তর করে।
এই পাইথন স্ক্রিপ্টটি ধীর এবং সিপিইউ-আবদ্ধ (একাধিক-কোর মেশিনে একক কোর), সুতরাং আমি এটির তিনটি দৃষ্টান্ত চালাতে চাই - প্রতিটি তথ্য টাইপের জন্য একটি - এবং তাদের আউটপুটটি এতে প্রবেশের জন্য একত্রিত করতে চাই sort
। মূলত: এর সমতুল্য:
{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n
তবে তিনটি স্ক্রিপ্ট সমান্তরালে চলছে।
আমি এই প্রশ্নটি পেয়েছি যেখানে জিএনইউ split
স্ট্রিমটি পরিচালনা করে এমন কোনও স্ক্রিপ্টের এন দৃষ্টান্তের মধ্যে কিছু স্টডআউট স্ট্রিমকে রাউন্ড-রবিন করার জন্য ব্যবহার করা হচ্ছে।
বিভক্ত মানুষ পৃষ্ঠা থেকে:
-n, --number=CHUNKS
generate CHUNKS output files. See below
CHUNKS may be:
N split into N files based on size of input
K/N output Kth of N to stdout
l/N split into N files without splitting lines
l/K/N output Kth of N to stdout without splitting lines
r/N like 'l' but use round robin distributio
সুতরাং r/N
কমান্ডটি " বিভক্ত রেখা ছাড়াই " বোঝায় ।
এর উপর ভিত্তি করে, এটি মনে হচ্ছে যে নিম্নলিখিত সমাধানগুলি ব্যবহারযোগ্য হওয়া উচিত:
split -n r/3 -u --filter="./choose_script" << EOF
> 1
> 2
> 3
> EOF
এটি কোথায় choose_script
:
#!/bin/bash
{ read x; ./handle_$x.py; }
দুর্ভাগ্যক্রমে, আমি কিছু লাইনগুলিতে অন্তর্নির্মিত দেখতে পাচ্ছি - এবং প্রচুর নতুন লাইনের উপস্থিতি নেই।
উদাহরণস্বরূপ, যদি আমি আমার পাইথন স্ক্রিপ্টগুলি কিছু সাধারণ বাশ স্ক্রিপ্টগুলির সাথে প্রতিস্থাপন করি যা এটি করে:
#!/bin/bash
# ./handle_1.sh
while true; echo "1-$RANDOM"; done;
।
#!/bin/bash
# ./handle_2.sh
while true; echo "2-$RANDOM"; done;
।
#!/bin/bash
# ./handle_3.sh
while true; echo "3-$RANDOM"; done;
আমি এই আউটপুটটি দেখতে পাচ্ছি:
1-8394
2-11238
2-22757
1-723
2-6669
3-3690
2-892
2-312511-24152
2-9317
3-5981
এটি বিরক্তিকর - আমি উপরে পেস্ট করা ম্যান পেজ এক্সট্রাক্টের ভিত্তিতে এটি লাইন অখণ্ডতা বজায় রাখা উচিত।
স্পষ্টতই এটি কাজ করে যদি আমি -u
যুক্তিটি সরিয়ে ফেলি তবে তবে এটি বাফার হয়ে গেছে এবং আমি স্মৃতি থেকে বেরিয়ে যাব কারণ এটি স্ক্রিপ্টগুলির মধ্যে একটি ব্যতীত সকলের আউটপুটকে বাফার করে।
এখানে কারও কিছু অন্তর্দৃষ্টি থাকলে এটি প্রশংসিত হবে। আমি এখানে আমার গভীরতার বাইরে।
job1.py > file1 & job2.py > file 2 & job3.py > file3 ; wait ; sort -n file1 file2 file3
?
coproc
বিল্ট ইন ব্যাশের দিকে নজর দিতেও বলা হয়েছিল , যদিও আমি সত্যিই এটি কীভাবে প্রযোজ্য তা দেখতে পাই না।