Multi-Threading / Forking ในสคริปต์ทุบตี


9

ฉันได้เขียนสคริปต์ทุบตีซึ่งอยู่ในรูปแบบต่อไปนี้:

#!/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พร้อมกัน

สิ่งนี้สามารถทำได้?


ระวัง: สคริปต์ที่แตกต่างกันจะต้องเขียนไปยังoutfiles ที่แตกต่างกัน สคริปต์ของคุณเป็นลายลักษณ์อักษรจะลบไฟล์อินพุตเป็นการกระทำแรก!
pjc50

คำตอบ:


10

GNUparallelสร้างขึ้นเพื่อสิ่งเหล่านี้ คุณสามารถเรียกใช้สคริปต์ของคุณหลาย ๆ ครั้งพร้อมกับข้อมูลที่แตกต่างจากการป้อนข้อมูลของคุณสำหรับแต่ละคน:

cat input.txt | parallel --pipe your-script.sh

โดยค่าเริ่มต้นมันจะวางไข่กระบวนการตามจำนวนของตัวประมวลผลในระบบของคุณ -j Nแต่คุณสามารถปรับแต่งด้วย

เคล็ดลับเรียบร้อยโดยเฉพาะอย่างยิ่งคือคุณสมบัติห่อ Shebang หากคุณเปลี่ยนบรรทัดแรกของสคริปต์ Bash เป็น:

#!/usr/bin/parallel --shebang-wrap --pipe /bin/bash

และป้อนข้อมูลในอินพุตมาตรฐานจากนั้นข้อมูลทั้งหมดจะเกิดขึ้นโดยอัตโนมัติ สิ่งนี้มีประโยชน์น้อยกว่าเมื่อคุณมีรหัสการล้างข้อมูลที่ต้องทำงานในตอนท้ายซึ่งคุณอาจทำได้

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

มีตัวเลือกมากมายสำหรับกรณีการใช้งานที่แตกต่างกันโดยเฉพาะ แต่การสอนครอบคลุมสิ่งต่าง ๆ ค่อนข้างดี ตัวเลือกที่คุณอาจจะสนใจในการรวมและ--round-robin--group


1
คุณทดสอบว่า shebang line หรือเปล่า? Shebangs ที่มีอาร์กิวเมนต์หลายตัวไม่สามารถถอดออกได้ บน Linux #!a b cจะส่งผลให้["b c"]ในขณะที่ระบบอื่น ๆ ["b", "c"]บางส่วนก็จะส่งผลให้
nyuszika7h

1
มันจะแยกข้อโต้แย้งของตัวเองเมื่อใช้ในลักษณะนี้ (มิฉะนั้นตัวเลือกจะไม่ใช้มาก)
Michael Homer

@MichaelHomer ฉันต้องใช้GNU parallelสำหรับการขูดหน้า HTML คุณช่วยกรุณาอ่านหัวข้อนี้ได้ที่unix.stackexchange.com/questions/277609/…
Swatesh Pakhare
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.