ค้นหายูนิกซ์ที่ดีกว่าด้วยการประมวลผลแบบขนาน?


43

find(1)ยูทิลิตีunix มีประโยชน์มากทำให้ฉันสามารถดำเนินการกับไฟล์จำนวนมากที่ตรงกับข้อกำหนดเฉพาะเช่น

find /dump -type f -name '*.xml' -exec java -jar ProcessFile.jar {} \;

ข้างต้นอาจเรียกใช้สคริปต์หรือเครื่องมือในทุกไฟล์ XML ในไดเรกทอรีเฉพาะ

สมมติว่าสคริปต์ / โปรแกรมของฉันใช้เวลา CPU นานและฉันมีโปรเซสเซอร์ 8 ตัว มันจะดีในการประมวลผลสูงสุด 8 ไฟล์ในเวลาเดียวกัน

GNU ช่วยให้สามารถประมวลผลงานคู่ขนานด้วยการ-jตั้งค่าสถานะได้ แต่findดูเหมือนจะไม่มีฟังก์ชั่นดังกล่าว มีวิธีการจัดตารางเวลางานทั่วไปทางเลือกในการเข้าใกล้สิ่งนี้หรือไม่?

คำตอบ:


65

xargsด้วย-Pตัวเลือก (จำนวนกระบวนการ) ว่าฉันต้องการบีบอัด logfiles ทั้งหมดในไดเรกทอรีบนเครื่อง 4-cpu:

find . -name '*.log' -mtime +3 -print0 | xargs -0 -P 4 bzip2

นอกจากนี้คุณยังสามารถระบุ-n <number>จำนวนหน่วยงานสูงสุดต่อกระบวนการ ถ้าอย่างนั้นฉันมีไฟล์ 2500 ไฟล์และฉันก็บอกว่า:

find . -name '*.log' -mtime +3 -print0 | xargs -0 -n 500 -P 4 bzip2

สิ่งนี้จะเริ่มต้นbzip2กระบวนการที่4 ซึ่งแต่ละไฟล์มี 500 ไฟล์และเมื่อกระบวนการแรกเสร็จแล้วอีกกระบวนการจะเริ่มต้นสำหรับ 500 ไฟล์สุดท้าย

ไม่แน่ใจว่าทำไมคำตอบก่อนหน้านี้ใช้xargs และ makeคุณมีเครื่องยนต์คู่ขนานสองตัวที่นั่น!


7
ด้วย find / xargs ให้ระวัง: หาค่าดีฟอลต์ของบรรทัดใหม่เป็นตัวคั่นเอาต์พุต แต่ค่าดีฟอลต์ของ xargs ไปที่ช่องว่างใด ๆ เป็นตัวคั่นอินพุต ใช้ -0 ทั้งคู่เพื่อความปลอดภัยหรือเปลี่ยนเป็น GNU ขนานซึ่งค่าเริ่มต้นเป็นบรรทัดใหม่เป็นตัวคั่นอินพุต (ผลลัพธ์ของการค้นหาการจับคู่)
ephemient

1
ว้าวน่าทึ่งมาก! ฉันเพิ่งตรวจสอบและเป็นจริง xargs มี-Pตัวเลือก!
PP

ระวังของการใช้xargs -P- มันมีข้อผิดพลาดที่ไม่เคยคงที่ของการบิดเบือนการส่งออก (เหมือนparallel) เมื่อใดก็ตามที่ 2 หัวข้อที่เกิดขึ้นกับการส่งออกการผลิตในขณะเดียวกัน ...
Vlad

34

GNU แบบขนานสามารถช่วยได้เช่นกัน

find /dump -type f -name '*.xml' | parallel -j8 java -jar ProcessFile.jar {}

โปรดทราบว่าหากไม่มี-j8อาร์กิวเมนต์ให้ใช้parallelค่าเริ่มต้นตามจำนวนแกนในเครื่องของคุณ :-)


6

ไม่จำเป็นต้อง "แก้ไข" find- ใช้ประโยชน์จากmakeตัวเองเพื่อจัดการความเท่าเทียม

ให้กระบวนการของคุณสร้างล็อกไฟล์หรือไฟล์เอาต์พุตอื่นจากนั้นใช้ Makefile ดังนี้:

.SUFFIXES:  .xml .out

.xml.out:
        java -jar ProcessFile.jar $< 1> $@

และเรียกเช่นนี้:

find /dump -type f -name '*.xml' | sed -e 's/\.xml$/.out/' | xargs make -j8

ยิ่งไปกว่านั้นถ้าคุณแน่ใจว่าไฟล์เอาต์พุตถูกสร้างขึ้นเมื่อกระบวนการ Java สำเร็จแล้วคุณสามารถใช้ประโยชน์จากการmakeจัดการการพึ่งพาเพื่อให้แน่ใจว่าในครั้งถัดไปรอบ ๆ เฉพาะไฟล์ที่ยังไม่ได้ดำเนินการ


1
หวังว่าจะไม่มีที่ว่างหรืออักขระ "น่าสนใจ" อื่น ๆ ในชื่อไฟล์เหล่านั้น ทำให้ไม่ได้จัดการกับสิ่งเหล่านั้นอย่างหรูหรา
ephemient

ความคิดที่ยอดเยี่ยม! ไม่เคยคิดที่จะใช้ makefiles แบบนี้
oscfri

3

ค้นหามีตัวเลือกแบบขนานที่คุณสามารถใช้โดยตรงโดยใช้สัญลักษณ์ "+" ไม่จำเป็นต้องใช้ xargs เมื่อรวมเข้ากับ grep มันสามารถตัดผ่านต้นไม้ของคุณเพื่อค้นหาการจับคู่ได้อย่างรวดเร็ว ตัวอย่างเช่นหากฉันกำลังมองหาไฟล์ทั้งหมดในไดเรกทอรีต้นทางของฉันที่มีสตริง 'foo' ฉันสามารถเรียกใช้
find sources -type f -exec grep -H foo {} +


12
อ่านคู่มือการค้นหาคุณจะเห็นว่า-exec command +ไวยากรณ์ไม่ได้ทำงานควบคู่กัน แต่ "รวมกลุ่ม" หลายไฟล์เข้าด้วยกันและเรียกใช้คำสั่งที่มีหลายไฟล์เป็นอาร์กิวเมนต์ในเวลาเดียวกัน มันเกิดขึ้นที่ grep สามารถมองผ่านเป้าหมายของมันในแบบคู่ขนาน
Gyscos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.