คำถามติดแท็ก parallelism

ทำงานแบบคู่ขนานเพื่อใช้ประโยชน์จากโปรเซสเซอร์หลายตัว

1
ฉันจะรับดัชนีของ "หน่วยประมวลผลแบบขนาน" xargs ได้อย่างไร?
สมมติว่าฉันมีสองทรัพยากรชื่อ0และ1ที่สามารถเข้าถึงได้เท่านั้น มีวิธีใดในการกู้คืน "ดัชนี" ของ "ตัวประมวลผลแบบขนาน" ที่xargsเปิดตัวเพื่อใช้เป็นบริการการยกเว้นซึ่งกันและกันฟรี เช่นพิจารณาการคำนวณแบบขนานต่อไปนี้: $ echo {1..8} | xargs -d " " -P 2 -I {} echo "consuming task {}" consuming task 1 consuming task 2 consuming task 3 consuming task 4 consuming task 5 consuming task 6 consuming task 7 consuming task 8 คำถามของฉันคือว่ามีคำวิเศษพูดว่าindexที่ผลลัพธ์จะมีลักษณะ $ echo …

9
กระจาย stdin ไปยังกระบวนการแบบขนาน
ฉันมีงานที่ประมวลผลรายการไฟล์ใน stdin เวลาเริ่มต้นของโปรแกรมมีความสำคัญและระยะเวลาที่แต่ละไฟล์ใช้กันอย่างกว้างขวาง ฉันต้องการที่จะวางไข่เป็นจำนวนมากในกระบวนการเหล่านี้จากนั้นส่งงานไปยังที่ใดก็ตามที่ไม่ยุ่ง มีเครื่องมือ commandline ที่แตกต่างกันหลายอย่างที่เกือบจะทำในสิ่งที่ฉันต้องการฉัน จำกัด ให้เหลือสองตัวเลือกที่ใช้งานได้ find . -type f | split -n r/24 -u --filter="myjob" find . -type f | parallel --pipe -u -l 1 myjob ปัญหาก็คือsplitการปัดเศษบริสุทธิ์ดังนั้นหนึ่งในกระบวนการที่ได้รับข้างหลังและอยู่ข้างหลังล่าช้าการดำเนินการทั้งหมดเสร็จสมบูรณ์; ในขณะที่parallelต้องการวางไข่หนึ่งกระบวนการต่อ N บรรทัดหรือไบต์ของอินพุตและฉันปิดท้ายการใช้จ่ายเวลามากเกินไปในการเริ่มต้นค่าใช้จ่าย มีบางอย่างเช่นนี้ที่จะใช้กระบวนการและฟีดบรรทัดไปยังกระบวนการใดก็ตามที่มี stdins ที่ไม่ถูกบล็อก

4
การสร้างสตรีมเอาต์พุตเดี่ยวจากสามสตรีมอื่นที่สร้างแบบขนาน
ฉันมีข้อมูลสามชนิดที่มีรูปแบบต่างกัน สำหรับแต่ละชนิดข้อมูลมีสคริปต์ Python ที่แปลงเป็นรูปแบบรวมเป็นหนึ่งเดียว สคริปต์ Python นี้ช้าและ CPU ที่ถูกผูกไว้ (เพื่อหลักเดียวในเครื่องแบบ multi-core) ดังนั้นฉันต้องการที่จะทำงานสามกรณีของมัน - หนึ่งสำหรับแต่ละชนิดข้อมูล - sortและรวมการส่งออกของพวกเขาจะผ่านมันเข้าไป โดยทั่วไปเทียบเท่ากับสิ่งนี้: { ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n แต่ด้วยสามสคริปต์ที่ทำงานในแบบคู่ขนาน ฉันพบคำถามนี้ที่ GNU splitถูกใช้เพื่อปัดเศษสตรีม stdout บางส่วนระหว่าง n อินสแตนซ์ของสคริปต์ที่จัดการสตรีม จากหน้าแยกคน: -n, --number=CHUNKS generate CHUNKS output files. See below CHUNKS may be: N split into N files …

1
ใช้ซีพียูแกนเดียวเท่านั้น
ฉันต้องการเรียกใช้การทดสอบประสิทธิภาพสำหรับโปรแกรมที่ทำงานพร้อมกันและความต้องการของฉันคือมันควรจะทำงานบนCPU core เพียงแกนเดียวเท่านั้น (ฉันไม่ต้องการเธรดที่ทำงานร่วมกัน - ฉันต้องการเปลี่ยนบริบทเสมอ) ดังนั้นฉันมีสองคำถาม: ทางออกที่ดีที่สุด - วิธีลงชื่อและจองซีพียูแกนเดียวเท่านั้นสำหรับโปรแกรมของฉัน (เพื่อบังคับให้ OS ไม่ใช้ CPU core นี้) ฉันเดาว่ามันเป็นไปไม่ได้ แต่บางทีฉันผิด ... วิธีตั้งค่า linux (Fedora 24) ให้ใช้ CPU core เพียงอันเดียว?

3
แก้ไขการใช้ xargs แบบขนาน
ฉันใช้xargsโทรสคริปต์ไพ ธ อนเพื่อประมวลผลไฟล์ขนาดเล็กประมาณ 30 ล้านไฟล์ ฉันหวังว่าจะใช้xargsเพื่อขนานกระบวนการ คำสั่งที่ฉันใช้คือ: find ./data -name "*.json" -print0 | xargs -0 -I{} -P 40 python Convert.py {} > log.txt โดยทั่วไปConvert.pyจะอ่านในไฟล์jsonขนาดเล็ก(4kb) ทำการประมวลผลและเขียนไปยังไฟล์ 4kb อื่น ฉันกำลังทำงานบนเซิร์ฟเวอร์ที่มี 40 คอร์ CPU และไม่มีกระบวนการอื่นที่ใช้งาน CPU สูงบนเซิร์ฟเวอร์นี้ จากการตรวจสอบ htop (btw มีวิธีอื่นที่ดีในการตรวจสอบประสิทธิภาพของ CPU หรือไม่) ฉันพบว่า-P 40ไม่เร็วเท่าที่ควร บางครั้งแกนทั้งหมดจะหยุดและลดลงจนเกือบเป็นศูนย์ประมาณ 3-4 วินาทีจากนั้นจะฟื้นตัวเป็น 60-70% จากนั้นฉันพยายามลดจำนวนกระบวนการแบบขนานเป็น-P 20-30แต่ก็ยังไม่เร็วมาก พฤติกรรมในอุดมคติควรเป็นแบบความเร็วเชิงเส้น มีข้อเสนอแนะใด …

1
Multi-Threading / Forking ในสคริปต์ทุบตี
ฉันได้เขียนสคริปต์ทุบตีซึ่งอยู่ในรูปแบบต่อไปนี้: #!/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 เนื่องจาก$inFileมีความยาว 3,500+ บรรทัดสคริปต์จะใช้เวลา 6-7 ชั่วโมงในการดำเนินการอย่างสมบูรณ์ เพื่อลดเวลานี้ฉันวางแผนที่จะใช้หลายเธรดหรือฟอร์กในสคริปต์นี้ ถ้าฉันสร้างกระบวนการลูก 8 กระบวนการจะประมวลผล 8 บรรทัด$inFileพร้อมกัน สิ่งนี้สามารถทำได้?

2
การขนานสำหรับลูป
ฉันต้องการขนานforลูปของรหัสต่อไปนี้ ทำอย่างไร #!/bin/bash N=$1 n=$2 for (( i=1; i<=$N; i++ )); do min=100000000000000 //set min to some garbage value for (( j=1; j<=$n; j++ )); do val=$(/path/to/a.out) val2=`echo $val | bc` if (( $val2 < $min )); then min=$val2; fi done arr=("${arr[@]}" "$min") done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.