Kako nadopuniti svoj bash tijek rada paralelno s GNU-om

GNU parallelje alat naredbenog retka za paralelno izvođenje poslova.

parallelje sjajan i pripada u alatni okvir svakog programera. Ali smatrao sam da su dokumenti u početku pomalo neodoljivi. Srećom, možete početi biti korisni parallelsa samo nekoliko osnovnih naredbi.

Zašto je paralleltako korisno?

Usporedimo sekvencijalno i paralelno izvršavanje istog računalno intenzivnog zadatka.

Zamislite da imate mapu .wav audio datoteka za pretvaranje u .flac:

To su prilično velike datoteke, svaka je barem gigabajt.

Za pretvorbu datoteka upotrijebit ćemo još jedan izvrstan alat naredbenog retka, ffmpeg. Evo što trebamo pokrenuti za svaku datoteku.

ffmpeg -i audio1.wav audio1.flac

Napišimo skriptu za pretvaranje svake uzastopno:

# 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

Izvršenje zadatka možemo vremenski ograničiti dodavanjem prethodnog timepoziva pozivom skripte s terminala. timeispisat će stvarno vrijeme proteklo tijekom izvršenja.

time ./convert.sh

Naš scenarij završava za nešto više od minute.

Nije loše. Ali sada pokrenimo to paralelno!

Ne moramo ništa mijenjati na našoj skripti. Pomoću -azastave možemo izravno uvesti našu skriptu parallel. parallelizvodit će svaki redak kao zasebnu naredbu.

parallel -a ./convert.sh

Koristeći se parallel, naša konverzija izvršila se u nešto više od pola vremena. Lijepo!

Sa samo pet datoteka, ova razlika nije tako velika stvar. Ali s većim popisima i dužim zadacima možemo uštedjeti puno vremena parallel.

Susreo sam se paralleltijekom rada sa zadatkom obrade podataka koji bi se vjerojatno odvijao sat vremena ili više da se radi uzastopno. Sa parallel, trebalo je samo nekoliko minuta.

parallelsnaga ovisi i o vašem računalu. Intel i7 mog MacBooka Pro ima samo 4 jezgre. Čak ih je i ovaj mali zadatak gurnuo sve do krajnjih granica:

Moćnija računala mogu imati procesore s 8, 16 ili čak 32 jezgre, nudeći veliku uštedu vremena paralelizacijom vaših poslova.

Biti koristan sa parallel

Druga velika prednost parallelje njegova kratkoća i jednostavnost. Počnimo s gadnom Python skriptom i pretvorimo je u čisti poziv na parallel.

Evo Python skripte za izvršavanje pretvorbe audio datoteka:

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)

Jao! To je zapravo puno koda o kojem treba razmišljati samo radi pretvorbe nekih datoteka. (Ovo traje oko 1,2 minute).

Pretvorimo naš Python u parallel.

Pozivanje skripte sa parallel -a

parallel -a your-script-here.sh je lijepa jednostruka linija koju smo gore koristili za umetanje u našu bash skriptu.

Ovo je sjajno, ali zahtijeva da napišete bash skriptu koju želite izvršiti. U našem primjeru, mi još uvijek ispisivala svaki pojedinačni poziv na ffmpegin convert.sh.

Cijevi i interpolacija žica s parallel

Srećom, paralleldaje nam način da u convert.shpotpunosti izbrišemo .

Evo sve što moramo pokrenuti da bismo postigli našu pretvorbu:

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

Razdvojimo ovo.

Dobivamo popis svih .wav datoteka u našem direktoriju s ls *.wav. Tada pipiramo ( |) taj popis parallel.

Paralelno pruža nekoliko korisnih načina za interpolaciju niza, tako da se putovi datoteka ispravno unose.

Prvi je {}, koji se parallelautomatski zamjenjuje jednim retkom iz našeg unosa.

Drugi je operator {.}koji će unijeti jedan redak, ali s uklonjenim ekstenzijama datoteke.

Kad bismo proširili naredbu koju je pokrenuo parallelza naš prvi redak unosa, vidjeli bismo ...

ffmpeg -i audio1.wav audio1.flac

Svađe sa Parallel

Kako se ispostavilo, ne trebamo čak ni lspokušavati dovršiti svoj zadatak. Još jednostavnije:

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

Argumenti proslijeđeni da se paralleldogode nakon naredbe i odvojeni su :::. U ovom slučaju, naš je argument *.wavkoji će pružiti popis svih .wav datoteka u našem direktoriju. Te datoteke postaju ulaz za naš brzi parallelposao.

Fun fact: parallel was built by Ole Tange and published in 2011. According to him, you can use the tool for research without citing the source paper for the modest fee of 10,000 euros!

Thanks for reading!