GNU ขนานไม่แบ่งงานเท่ากัน


2

ความเข้าใจของฉันคือการที่ตัวเลือก -X ควรกระจายข้อโต้แย้งอย่างเท่าเทียมกันในหมู่งาน แต่ฉันได้รับการแจกแจงที่เบ้มาก:

user@host:/tmp/ptest$ count() {
>   echo $#
> }
user@host:/tmp/ptest$ export -f count

user@host:/tmp/ptest$ count *.jpg
5825
user@host:/tmp/ptest$ parallel -X count ::: *.jpg
5039
197
197
197
195

น่าสนใจพอเพียงการใช้ชุดย่อยของไฟล์นำไปสู่การแจกแจงแบบสม่ำเสมอของพารามิเตอร์:

user@host:/tmp/ptest$ count p129*.jpg
975
user@host:/tmp/ptest$ parallel -X count ::: p129*.jpg
244
244
244
243

user@host:/tmp/ptest$ count p12*.jpg
4007
user@host:/tmp/ptest$ parallel -X count ::: p12*.jpg
1002
1002
1002
1001

user@host:/tmp/ptest$ count p13*.jpg
1818
user@host:/tmp/ptest$ parallel -X count ::: p13*.jpg
455
455
455
453

เหตุใดในกรณีแรกและฉันจะแก้ไขได้อย่างไร

คำตอบ:


3

-X กระจายอย่างสม่ำเสมอเมื่อมันมาถึง EOF

ดังนั้นในกรณีของคุณมันเติมบัฟเฟอร์สำหรับบรรทัดคำสั่งแบบเต็ม (ชื่อ 5039) และเริ่มต้นที่ จากนั้นอ่านอีก 800 ชื่อจนกว่าจะถึง EOF นั่นไม่เพียงพอที่จะเริ่มงานเต็มดังนั้นงานเหล่านี้จะถูกกระจายในหมู่งานจำนวนมาก

ดูหน้า 37 https://zenodo.org/record/1146014

วิธีนี้ทำเพื่อหลีกเลี่ยงการอ่านงานทั้งหมดล่วงหน้าเนื่องจากงานทั้งหมดอาจไม่พร้อมใช้งาน (คิดว่า tail -f file.names | parallel ... )

มันอาจเป็นความคิดที่ดีกว่าถ้า GNU Parallel อ่านชื่อเพียงพอที่จะเติมงานทั้งหมดก่อนที่จะเริ่มงานต่อไป -X โหมดดังนั้นจึงสามารถตรวจพบ EOF ก่อนหน้านี้ อย่างไรก็ตามเรื่องนี้ยังไม่ได้ดำเนินการ ยินดีต้อนรับ Patch

วิธีแก้ปัญหาคือการใช้:

ls *.jpg |
  parallel --round --pipe -N1 parallel -Xj1 count

มันไม่สามารถส่งออกหลังจากแต่ละงาน แต่มันสามารถทำเอาต์พุต linebuffered:

ls *.jpg |
  parallel --lb --round --pipe -N1 parallel --lb -Xj1 count

หากชื่อไฟล์มี \ n:

printf '%s\0' *.jpg |
  parallel --recend '\0' --round --lb --pipe -N1 parallel -0Xj1 count

ขอบคุณที่อธิบายว่าทำไมสิ่งนี้ถึงเกิดขึ้น มีวิธีใดบ้างที่จะบรรลุหรือใกล้เคียงกับพฤติกรรมที่ต้องการ?
Zoltan

1
เนื้อหาที่เชื่อมโยงดูเหมือนหนังสือที่ยอดเยี่ยม!
Zoltan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.