ฉันมีข้อมูลสามชนิดที่มีรูปแบบต่างกัน สำหรับแต่ละชนิดข้อมูลมีสคริปต์ 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 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; }
น่าเสียดายที่ฉันเห็นบางบรรทัดแทรกเข้ามาและมีการขึ้นบรรทัดใหม่ที่ไม่ควรมี
ตัวอย่างเช่นถ้าฉันแทนที่สคริปต์ Python ของฉันด้วยสคริปต์ทุบตีง่ายๆที่ทำสิ่งนี้:
#!/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
บิวอินในทุบตีแม้ว่าฉันจะไม่เห็นว่ามันใช้งานได้จริง