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

  1. 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.

  1. Komprimera bz2-filerna med bzcat till stdout
  2. Grep (t.ex. filter) rader med specifika nyckelord med hjälp av grep <some key word>
  3. 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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow