Bash
Parallell
Sök…
Introduktion
Jobb i GNU Linux kan parallelliseras med GNU-parallell. Ett jobb kan vara ett enda kommando eller ett litet skript som måste köras för var och en av raderna i ingången. Den typiska inmatningen är en lista med filer, en lista med värdar, en lista med användare, en lista med URL: er eller en lista med tabeller. Ett jobb kan också vara ett kommando som läses från ett rör.
Syntax
- parallell [alternativ] [kommando [argument]] <list_of_arguments>
parametrar
Alternativ | Beskrivning |
---|---|
-jn | Kör n jobb parallellt |
-k | Håll samma ordning |
-X | Flera argument med kontext ersätter |
--colsep regexp | Dela ingången på regexp för positionsbyten |
{} {.} {/} {/.} {#} | Ersättningssträngar |
{3} {3.} {3/} {3/.} | Positiva ersättningssträngar |
-S sshlogin | Example: [email protected] |
--trc {}.bar | Kortfattad för - överföring - return {} .bar --cleanup |
--onall | Kör det givna kommandot med argument på alla sshlogins |
--nonall | Kör det givna kommandot utan argument för alla sshlogins |
--pipe | Dela stdin (standardinmatning) till flera jobb. |
--recend str | Spela in slutavskiljaren för - röret. |
--recstart str | Spela in startseparatorn för - röret. |
Parallellera upprepade uppgifter i listan över filer
Många upprepade jobb kan utföras mer effektivt om du använder mer av din dators resurser (dvs. CPU och RAM). Nedan är ett exempel på att köra flera jobb parallellt.
Anta att du har en < list of files >
, säg utgång från ls
. Låt också dessa filer komprimeras bz2 och följande ordningsföljder måste köras på dem.
- Komprimera bz2-filerna med
bzcat
till stdout - Grep (t.ex. filter) rader med specifika nyckelord med hjälp av
grep <some key word>
- Rör utdata som ska sammanlänkas i en enda gzippad fil med
gzip
Att köra detta med en stund-loop kan se ut så här
filenames="file_list.txt"
while read -r line
do
name="$line"
## grab lines with puppies in them
bzcat $line | grep puppies | gzip >> output.gz
done < "$filenames"
Med GNU Parallel kan vi köra 3 parallella jobb på en gång genom att helt enkelt göra
parallel -j 3 "bzcat {} | grep puppies" ::: $( cat filelist.txt ) | gzip > output.gz
Detta kommando är enkelt, kortfattat och mer effektivt när antalet filer och filstorlek är stort. Jobb initieras genom parallel
, alternativ -j 3
lanserar 3 parallella jobb och input till parallella jobb tas in av :::
. Utgången gzip > output.gz
så småningom till gzip > output.gz
Parallellera STDIN
Låt oss nu föreställa oss att vi har en stor fil (t.ex. 30 GB) som måste konverteras, rad för rad. Säg att vi har ett skript, convert.sh
, som gör det här <task>
. Vi kan leda innehållet i denna fil till stdin för parallell att ta in och arbeta med i bitar som
<stdin> | parallel --pipe --block <block size> -k <task> > output.txt
där <stdin>
kan komma från allt som cat <file>
.
Som ett reproducerbart exempel kommer vår uppgift att vara nl -n rz
. Ta vilken fil som helst, min kommer att vara data.bz2
och skicka den till <stdin>
bzcat data.bz2 | nl | parallel --pipe --block 10M -k nl -n rz | gzip > ouptput.gz
Exemplet ovan tar <stdin>
från bzcat data.bz2 | nl
, där jag ingår nl
bara som en proof of concept att slutresultatet output.gz
sparas i den ordning de togs emot. Sedan delar parallel
<stdin>
i bitar i storlek 10 MB, och för varje bit passerar den den genom nl -n rz
där den bara lägger till ett antal som är rätt motiverade (se nl --help
för ytterligare information). Alternativen - --pipe
talar parallel
att dela <stdin>
i flera jobb och -- block
anger storleken på blocken. Alternativet -k
anger att beställningen måste upprätthållas.
Din slutproduktion ska se ut något
000001 1 <data>
000002 2 <data>
000003 3 <data>
000004 4 <data>
000005 5 <data>
...
000587 552409 <data>
000588 552410 <data>
000589 552411 <data>
000590 552412 <data>
000591 552413 <data>
Min ursprungliga fil hade 552 413 rader. Den första kolumnen representerar parallella jobb, och den andra kolumnen representerar det ursprungliga linjenumret som överfördes till parallel
i bitar. Du bör märka att ordningen i den andra kolumnen (och resten av filen) bibehålls.