Sådan overbelastes dine bash-arbejdsgange med parallel GNU

GNU paralleler et kommandolinjeværktøj til parallelkørsel af job.

paralleler fantastisk og hører hjemme i værktøjskassen til enhver programmør. Men jeg fandt dokumenterne lidt overvældende i starten. Heldigvis kan du begynde at være nyttig parallelmed blot et par grundlæggende kommandoer.

Hvorfor er paralleldet nyttigt?

Lad os sammenligne sekventiel og parallel udførelse af den samme beregningsintensive opgave.

Forestil dig, at du har en mappe med .wav-lydfiler, du kan konvertere til .flac:

Disse er ret store filer, hver er mindst en gigabyte.

Vi bruger et andet godt kommandolinjeværktøj, ffmpeg, til at konvertere filerne. Her er hvad vi har brug for at køre for hver fil.

ffmpeg -i audio1.wav audio1.flac

Lad os skrive et script for at konvertere hver enkelt sekventielt:

# convert.sh ffmpeg -i audio1.wav audio1.flac ffmpeg -i audio2.wav audio2.flac ffmpeg -i audio3.wav audio3.flac ffmpeg -i audio4.wav audio4.flac ffmpeg -i audio5.wav audio5.flac

Vi kan time udførelsen af ​​et job ved at foregribe, timenår vi ringer til scriptet fra terminalen. timeudskriver den forløbne tid, der er gået under udførelsen.

time ./convert.sh

Vores script slutter om lidt over et minut.

Ikke dårligt. Men lad os nu køre det parallelt!

Vi behøver ikke ændre noget ved vores script. Med -aflag kan vi føre vores script direkte ind i parallel. parallelvil køre hver linje som en separat kommando.

parallel -a ./convert.sh

Ved hjælp af parallelkørte vores konvertering lidt over halvdelen af ​​tiden. Pæn!

Med kun fem filer er denne forskel ikke så meget. Men med større lister og længere opgaver kan vi spare meget tid med parallel.

Jeg stødte på, parallelmens jeg arbejdede med en databehandlingsopgave, der sandsynligvis ville have kørt i en time eller mere, hvis den blev gjort sekventielt. Med paralleldet tog det kun et par minutter.

parallelstrøm afhænger også af din computer. Min MacBook Pro's Intel i7 har kun 4 kerner. Selv denne lille opgave skubbede dem alle til deres yderste:

Mere kraftfulde computere kan have processorer med 8, 16 eller endda 32 kerner, hvilket giver massiv tidsbesparelse gennem parallelisering af dine job.

At være nyttigt med parallel

Den anden store fordel ved paralleler dens korthed og enkelhed. Lad os starte med et grimt Python-script og konvertere det til et rent opkald til parallel.

Her er et Python-script til at udføre vores lydfilkonvertering:

import subprocess path = Path.home()/'my-data-here' for audio_file in list(path.glob('*.wav')): cmd = ['ffmpeg', '-i', str(audio_file), f'{audio_file.name.split(".")[0]}.flac'] subprocess.run(cmd, stdout=subprocess.PIPE)

Yikes! Det er faktisk en masse kode at tænke på bare for at konvertere nogle filer. (Dette tager cirka 1,2 minutter at køre).

Lad os konvertere vores Python til parallel.

Ringer til et script med parallel -a

parallel -a your-script-here.sh er den pæne one-liner, vi brugte ovenfor til at pibe i vores bash-script.

Dette er fantastisk, men kræver, at du skriver det bash-script, du vil udføre. I vores eksempel skrev vi stadig ud hvert enkelt opkald til ffmpegind convert.sh.

Rør og strenginterpolation med parallel

Heldigvis parallelgiver det os en måde at slette convert.shhelt på.

Her er alt, hvad vi skal køre for at gennemføre vores konvertering:

ls *.wav | parallel ffmpeg -i {} {.}.flac

Lad os nedbryde dette.

Vi får en liste over alle .wav-filer i vores bibliotek med ls *.wav. Så rør vi ( |) den liste til parallel.

Parallel giver nogle nyttige måder at gøre strenginterpolering på, så vores filstier indtastes korrekt.

Den første er {}, som parallelautomatisk erstattes med en linje fra vores input.

Den anden operatør er {.}, som vil indtaste en linje, men med eventuelle filtypenavne fjernet.

Hvis vi udvidede kommandoen, der blev kørt paralleltil vores første inputlinje, ville vi se ...

ffmpeg -i audio1.wav audio1.flac

Argumenterer med Parallel

Som det viser sig, behøver vi ikke engang at rør fra for lsat fuldføre vores opgave. Vi kan stadig være enklere:

parallel ffmpeg -i {} {.}.flac ::: *.wav

Argumenter, der sendes, parallelforekommer efter kommandoen og adskilles af :::. I dette tilfælde er vores argument *.wav, som giver listen over alle .wav-filer i vores bibliotek. Disse filer bliver input til vores lynhurtige paralleljob.

Sjov kendsgerning: parallelblev bygget af Ole Tange og udgivet i 2011. Ifølge ham kan du bruge værktøjet til forskning uden at nævne kildepapiret til et beskedent gebyr på 10.000 euro!

Tak for læsningen!