Scott Tiger Tech Blog

Blog technologiczny firmy Scott Tiger S.A.

GNU Parallel

Autor: Piotr Karpiuk o środa 5. Styczeń 2011

GNU parallel jest linuksowym narzędziem wiersza poleceń wykonującym zadania współbieżnie (wykorzystując dodatkowe rdzenie procesora) lokalnie i/lub przy użyciu zdalnych hostów (za pomocą SSH). Zadanie jest zwykle pojedynczym poleceniem lub małym skryptem i jest wykonywane dla każdego wiersza na wejściu (lista plików, lista hostów, itp.).

Jeśli używasz na codzień polecenia xargs shella, polecenie parallel będzie dla Ciebie proste do opanowania – z uwagi na te same opcje – i często wykorzystywane jako szybszy odpowiednik. Wyjście generowane przez współbieżne polecenia jest takie samo jak gdyby były one wykonywane kolejno – dzięki temu możesz wykorzystać wyjście jako wejście dla innych programów.

Dla każdego wiersza na standardowym wejściu GNU parallel będzie wykonywał polecenie z wierszem jako argumentem. Gdy nie ma polecenia, wiersze ze standardowego wejścia są traktowane jako polecenia do równoległego wykonania.

Polecenie

  gzip *

pakuje wszystkie pliki w bieżącym katalogu. Polecenie

  ls | parallel gzip

na dwurdzeniowym procesorze wykona to samo zadanie prawdopodobnie ok. dwukrotnie szybciej.

Powiedzmy że chcemy przepakować teraz te pliki z *.gz do *.bz z maksymalną kompresją:

  ls *.gz | parallel -j+0 --eta 'zcat {} | bzip2 -9 > {.}.bz2'

To polecenie nakazuje użyć wszystkich rdzeni procesora (-j 50% oznaczałoby połowę rdzeni) i wyświetlając informację o postępie (--eta).

Z kolei jeśli rozdzielimy to samo zadanie między 5 komputerów (lokalny i 4 zdalne):

  ls *.gz | parallel -j+0 --eta -Sserver1,server2,server3,server4,: --transfer --return {.}.bz2 --cleanup 'zcat {} | bzip2 -9 > {.}.bz2'

możemy się spodziewać znacznego przyspieszenia (np. 0:39 zamiast 3:35). Opcje --transfer, --return oraz --cleanup powodują przesłanie pliku do pakowania na zdalny serwer, po skończonej pracy skopiowanie go z powrotem na maszynę źródłową i usunięcie niepotrzebnych już plików z serwera zdalnego.

Załączony do posta tutorial w postaci video (angielski lektor) omawia te (i inne) przykłady znacznie dokładniej.

Uwaga: nie mylić GNU parallel z poleceniem parallel w pakiecie moreutils Debiana.

GNU Parallel, 5.0 out of 5 based on 1 rating
Share and Enjoy:
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Śledzik
  • Blip
  • Blogger.com
  • Gadu-Gadu Live
  • LinkedIn
  • MySpace
  • Wykop

Zostaw komentarz

XHTML: Możesz użyć następujących tagów: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>