GNU/Linux >> Znalost Linux >  >> Linux

Udělejte více na příkazovém řádku Linuxu s GNU Parallel

Máte někdy legrační pocit, že váš počítač není tak rychlý, jak by měl být? Kdysi jsem se tak cítil a pak jsem našel GNU Parallel.

GNU Parallel je shellový nástroj pro paralelní provádění úloh. Může analyzovat více vstupů, a tím spustit váš skript nebo příkaz proti sadám dat současně. Můžete použít vše konečně váš CPU!

Pokud jste někdy používali xargs , již víte, jak používat Parallel. Pokud ne, pak vás tento článek spolu s mnoha dalšími případy použití naučí.

Instalace GNU Parallel

GNU Parallel nemusí být na vašem počítači se systémem Linux nebo BSD předinstalován. Nainstalujte jej ze svého úložiště nebo kolekce portů. Například na Fedoře:

$ sudo dnf install parallel

Nebo na NetBSD:

# pkg_add paralelní

Pokud vše ostatní selže, přejděte na domovskou stránku projektu.

Od sériového k paralelnímu

Jak název napovídá, síla Parallel je v tom, že spouští úlohy paralelně, nikoli postupně, jak to mnozí z nás stále dělají.

Když spustíte jeden příkaz proti mnoha objektům, ze své podstaty vytváříte frontu. Určitý počet objektů může být zpracován příkazem a všechny ostatní objekty jen stojí a čekají, až na ně přijde řada. Je to neefektivní. S dostatečným množstvím dat bude vždy existovat fronta, ale proč místo jedné fronty nemít spoustu malých front?

Představte si, že máte složku plnou obrázků, které chcete převést z JPEG do PNG. Existuje mnoho způsobů, jak to udělat. Existuje ruční způsob otevření každého obrázku v GIMPu a jeho exportu do nového formátu. To je většinou ten nejhorší možný způsob. Je to náročné nejen na čas, ale i na práci.

Docela úhlednou variací na toto téma je řešení založené na shellu:

$ konvertovat 001.jpeg 001.png
$ konvertovat 002.jpeg 002.png
$ konvertovat 003.jpeg 003.png
... a tak dále ...

Je to skvělý trik, když se to poprvé naučíte, a zpočátku je to obrovské zlepšení. Není potřeba GUI a neustálé klikání. Ale stále je to náročné na práci.

Ještě lepší:

$ pro i v *jpeg; převést $i $i.png; hotovo

To alespoň uvede práci do pohybu a umožní vám dělat produktivnější věci. Problém je, že je to stále sériový proces. Jeden obrázek se převede a pak se další ve frontě převede a tak dále, dokud se fronta nevyprázdní.

S paralelním:

$ najít . -jméno "*jpeg" | paralelní -I% --max-args 1 převést % %.png

Toto je kombinace dvou příkazů:find příkaz, který shromažďuje objekty, se kterými chcete pracovat, a parallel příkaz, který třídí objekty a zajišťuje, že se vše zpracuje podle potřeby.

  • find . -name "*jpeg" najde všechny soubory v aktuálním adresáři, které končí jpeg .
  • parallel vyvolá GNU Parallel.
  • -I% vytvoří zástupný symbol nazvaný % , abyste zastoupili vše, co find předává Parallelovi. Používáte to, protože jinak byste museli ručně napsat nový příkaz pro každý výsledek find , a to je přesně to, čemu se snažíte vyhnout.
  • --max-args 1 omezuje rychlost, jakou Parallel požaduje nový objekt z fronty. Protože příkaz Parallel is running vyžaduje pouze jeden soubor, omezíte rychlost na 1. Prováděli jste složitější příkaz, který vyžadoval dva soubory (například cat 001.txt 002.txt > new.txt ), omezili byste sazbu na 2.
  • convert % %.png je příkaz, který chcete spustit v Parallel.

Výsledkem tohoto příkazu je find shromáždí všechny relevantní soubory a předá je parallel , který spustí úlohu a okamžitě požádá o další v řadě. Parallel to dělá tak dlouho, dokud je bezpečné spouštět nové úlohy, aniž by došlo k poškození počítače. Po dokončení starých úloh je nahradí novými, dokud nebudou zpracována všechna jí poskytnutá data. To, co předtím trvalo 10 minut, může s Parallel trvat jen 5 nebo 3.

Více vstupů

find command je vynikající bránou do Parallel, pokud znáte find a xargs (souhrnně nazývané GNU Find Utilities nebo findutils ). Poskytuje flexibilní rozhraní, se kterým je již mnoho uživatelů Linuxu spokojeno, a je docela snadné se jej naučit, pokud jste nováček.

find příkaz je poměrně jednoduchý:zadáte find s cestou k adresáři, který chcete prohledat, a určitou částí názvu souboru, který chcete vyhledat. Použijte zástupné znaky k rozšíření sítě; v tomto příkladu hvězdička označuje cokoli , takže find vyhledá všechny soubory, které končí řetězcem searchterm :

$ find /path/to/directory -name "*searchterm"

Ve výchozím nastavení find vrátí výsledky hledání po jedné položkách, s jednou položkou na řádek:

$ find ~/graphics -name "*jpg"
/home/seth/graphics/001.jpg
/home/seth/graphics/cat.jpg
/home/seth /graphics/penguin.jpg
/home/seth/graphics/IMG_0135.jpg

Když převedete výsledky find na parallel , každá položka na každém řádku je považována za jeden argument k příkazu parallel je arbitrážní. Pokud na druhou stranu potřebujete zpracovat více než jeden argument v jednom příkazu, můžete způsob předávání dat ve frontě rozdělit na parallel .

Zde je jednoduchý, nereálný příklad, který později převedu v něco užitečnějšího. Můžete se řídit tímto příkladem, pokud máte nainstalovaný GNU Parallel.

Předpokládejme, že máte čtyři soubory. Uveďte je, jednu na řádek, abyste přesně viděli, co máte:

$ echo ada> ada; echo lovelace> lovelace
$ echo richard> richard; echo stallman> stallman
$ ls -1
ada
lovelace
richard
stallman

Chcete spojit dva soubory do třetího, který obsahuje obsah obou souborů. To vyžaduje, aby měl Parallel přístup ke dvěma souborům, takže -I% proměnná v tomto případě nebude fungovat.

Výchozí chování Parallel je v podstatě neviditelné:

$ ls -1 | paralelní echo
ada
lovelace
richard
stallman

Nyní řekněte Parallel, že chcete získat dva objekty na úlohu:

$ ls -1 | paralelní --max-args=2 echo
ada lovelace
richard stallman

Nyní byly linky spojeny. Konkrétně dva výsledky z ls -1 jsou předány paralelně všechny najednou. To je správný počet argumentů pro tento úkol, ale v současnosti je to jeden argument:„ada lovelace“ a „richard stallman“. To, co ve skutečnosti chcete, jsou dva různé argumenty pro každou úlohu.

Naštěstí tuto technickou stránku analyzuje samotný Parallel. Pokud nastavíte --max-args2 , získáte dvě proměnné, {1} a {2} , představující první a druhou část argumentu:

$ ls -1 | paralelní --max-args=2 kočka {1} {2} ">" {1}_{2}.osoba

V tomto příkazu proměnná {1} je ada nebo richard (podle toho, na jakou práci se díváte) a {2} je buď lovelace nebo stallman . Obsah souborů je přesměrován se symbolem přesměrování v uvozovkách (uvozovky uchopí symbol přesměrování z Bash, aby jej Parallel mohl použít) a umístěny do nových souborů s názvem ada_lovelace.person a richard_stallman.person .

$ ls -1
ada
ada_lovelace.person
lovelace
richard
richard_stallman.person
stallman

$ kočka ada_*person
ada lovelace
$ cat ri*person
richard stallman

Pokud strávíte celý den analýzou souborů protokolu o velikosti stovek megabajtů, možná uvidíte, jak by vám mohla být užitečná paralelní analýza textu; jinak jde většinou o demonstrativní cvičení.

Tento druh zpracování je však neocenitelný nejen pro analýzu textu. Zde je reálný příklad z filmového světa. Zvažte adresář video souborů a zvukových souborů, které je třeba spojit.

$ ls -1
12_LS_establishing-manor.avi
12_wildsound.flac
14_butler-dialogue-mixed.flac
14_MS_butler.avi
...a tak dne...

Pomocí stejných principů lze vytvořit jednoduchý příkaz tak, že se soubory spojí paralelně :

$ ls -1 | paralelní --max-args=2 ffmpeg -i {1} -i {2} -vcodec copy -acodec copy {1}.mkv

Brute. Vynutit.

Všechny tyto efektní vstupní a výstupní analýzy nejsou každému po chuti. Pokud dáváte přednost přímějšímu přístupu, můžete hodit příkazy na Parallel a odejít.

Nejprve vytvořte textový soubor s jedním příkazem na každém řádku:

$ cat jobs2run
bzip2 oldstuff.tar
oggenc music.flac
opusenc ambiance.wav
převést bigfile.tiff small.jpeg
ffmepg -i foo. avi -v:b 12000k foo.mp4
xsltproc --output build/tmp.fo style/dm.xsl src/tmp.xml
bzip2 archive.tar

Poté soubor předejte společnosti Parallel:

$ parallel --jobs 6  

A nyní jsou všechny úlohy ve vašem souboru spuštěny paralelně. Pokud existuje více úloh, než je povoleno, vytvoří se fronta a bude ji udržovat Parallel, dokud nebudou spuštěny všechny úlohy.

Mnohem, mnohem více

GNU Parallel je výkonný a flexibilní nástroj s mnohem více případy použití, než se vejde do tohoto článku. Jeho manuálová stránka poskytuje příklady opravdu skvělých věcí, které s ním můžete dělat, od vzdáleného spouštění přes SSH po začlenění funkcí Bash do vašich paralelních příkazů. Na YouTube je dokonce rozsáhlá ukázková série, takže se můžete učit přímo od týmu GNU Parallel. Hlavní správce GNU Parallel také právě vydal oficiálního průvodce příkazem, který je k dispozici na Lulu.com.

GNU Parallel má moc změnit způsob, jakým počítáte, a pokud to neudělá, změní to přinejmenším čas, který váš počítač stráví počítačem. Zkuste to ještě dnes!


Linux
  1. Najděte soubory a adresáře v Linuxu pomocí příkazu find

  2. Práce s datovými toky na příkazovém řádku Linuxu

  3. Monitorování úrovně mikrofonu pomocí nástroje příkazového řádku v Linuxu

  1. 8 tipů pro příkazový řádek Linuxu

  2. Seřadit pomocí řazení na příkazovém řádku

  3. Zkopírujte a vložte na příkazový řádek Linuxu pomocí xclip

  1. Práce s rourami na příkazovém řádku Linuxu

  2. Použití linuxového příkazu find – Použití s ​​příklady

  3. Jak získám počet snímků ve videu na příkazovém řádku linuxu?