ฉันมีสคริปต์ Bash ที่ไม่สำคัญซึ่งมีรูปแบบคร่าวๆ ต่อไปนี้:
# Initialization
<generate_data> | while read line; do
# Run tests and filters on line
if [ "$tests_pass" ]; then
echo "$filtered_line"
fi
done | sort <sort_option> | <consume_data>
# Finalization
เมื่อเปรียบเทียบกับตัวกรอง ตัวสร้างจะใช้ทรัพยากรการประมวลผลน้อยที่สุด และแน่นอนว่าการดำเนินการเรียงลำดับไม่สามารถเริ่มต้นได้จนกว่าข้อมูลที่กรองทั้งหมดจะพร้อมใช้งาน ด้วยเหตุนี้ ตัวกรอง ซึ่งเป็นการเรียงซ้อนของลูปและเงื่อนไขต่างๆ ที่เขียนโดยกำเนิดใน Bash จึงเป็นคอขวดของการประมวลผล และกระบวนการเดียวที่รันลูปนี้จะใช้แกนประมวลผลทั้งหมด
วัตถุประสงค์ที่มีประโยชน์คือการกระจายตรรกะนี้ไปยังกระบวนการย่อยหลายๆ กระบวนการที่แต่ละกระบวนการรันลูปตัวกรองแยกกัน และแต่ละกระบวนการใช้บล็อกของบรรทัดจากตัวสร้าง และแต่ละกระบวนการสร้างบล็อกเอาต์พุตที่ต่อกันเข้ากับการดำเนินการเรียงลำดับ ฟังก์ชันการทำงานประเภทนี้มีให้ใช้งานผ่านเครื่องมือ เช่น GNU Parallel แต่การใช้งานจำเป็นต้องเรียกใช้คำสั่งภายนอกเพื่อทำงานในไปป์
มีเครื่องมือหรือคุณสมบัติที่สะดวกใด ๆ ที่ทำให้การดำเนินการกับสคริปต์สามารถกระจายไปยังกระบวนการต่าง ๆ โดยไม่กระทบต่อโครงสร้างโดยรวมของสคริปต์หรือไม่ ฉันไม่ทราบถึงฟีเจอร์ในตัวของ Bash แต่มีสิ่งหนึ่งที่มีประโยชน์อย่างแน่นอน
parallel
ซึ่ง OP ไม่ต้องการ (แม้ว่าinvoking an external command
จะไม่แย่เท่ากับการรันลูปใน bash) @epl อาจเป็นไปได้ที่จะเพิ่มความเร็วตัวกรองของคุณให้เพียงพอโดยไม่ต้องหันไปใช้การคำนวณแบบขนาน ด้วยอินพุตและเอาต์พุตที่น้อยที่สุด บางคนอาจให้วิธีแก้ปัญหาแก่คุณที่นี่ - person Socowi   schedule 02.12.2019such an improvement applied by itself is far inferior to that from utilizing more hardware in parallel
ฉันจะไม่นับมัน การวนซ้ำใน bash นั้นช้ามาก แม้ในแบบคู่ขนานก็มักจะไม่สามารถวิ่งเร็วกว่าภาษาอื่นหรือแม้แต่เครื่องมือพิเศษได้ ตัวอย่าง: ในการสร้างตัวเลขตั้งแต่ 1 ถึง 4'000'000 ฉันเปรียบเทียบ แนวทางต่อไปนี้ใน ควอดคอร์ หนึ่งลูปทุบตี (16.1 วินาที); สี่ลูปทุบตีแบบขนาน (5.2 วินาที) หนึ่ง awk วนซ้ำ (0.9 วินาที); และseq
(0.1 วินาที) โปรดทราบว่าลูปที่นี่ใช้เฉพาะบิวท์อินเท่านั้น หากคุณเรียกโปรแกรมภายนอกซ้ำ ๆ มันจะยิ่งแย่ลงไปอีก - person Socowi   schedule 02.12.2019LPUSH
บรรทัด/บล็อกในรายการ Redis ได้อย่างง่ายดายและเริ่มโปรเซสเซอร์หลายตัวที่BRPOP
บล็อกออกจากรายการและLPUSH
ผลลัพธ์ไปยังรายการอื่น งานตัวประมวลผลสามารถทำงานได้ในbash
, Python หรือ C++ ในทุกเครื่องในเครือข่ายของคุณ - person Mark Setchell   schedule 05.12.2019&
และรอ$!
แล้วหรือยัง? ฉันมักจะจัดเก็บผลลัพธ์แต่ละรายการไว้ในอาร์เรย์ รอให้ PID ทั้งหมดเสร็จสิ้น จากนั้นจึงเรียกใช้กระบวนการเรียงลำดับ/ขั้นสุดท้าย ฉันจะเขียนคำตอบพร้อมตัวอย่างสั้นๆ ในภายหลังหากคุณต้องการ - person Matthieu   schedule 07.12.2019