Jak miałbym używać GNU Parallel do tej pętli while?


12

Mam więc pętlę while:

cat live_hosts | while read host; do \
    sortstuff.sh -a "$host" > sortedstuff-"$host"; done

Ale może to zająć dużo czasu. Jak miałbym używać GNU Parallel do tej pętli while?

Odpowiedzi:


13

Nie używasz pętli while.

parallel "sortstuff.sh -a {} > sortedstuff-{}" <live_hosts

Zauważ, że to nie zadziała, jeśli masz ścieżki w swoim live_hosts(np. /some/dir/file), Ponieważ rozwinąłoby się do sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file(skutkując no such file or directory); w tych przypadkach użyj {//}i {/}(patrz gnu-parallelinstrukcja w celu uzyskania szczegółowych informacji):

parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts

Czy można używać teez parallelwprowadzaniem danych wyjściowych sortedstuff? Widzę więc, jak wygląda wyjście.
Proletariat

1
@Proletariat - też chcesz wysyłać dane do terminala? Wystarczy wymienić >z | teenp pierwsze polecenie staje parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
don_crissti

3

Jako oldschoolowy facet „zrób jedną rzecz i zrób to dobrze”, uniksowy facet, umieściłem substytucję ciągu znaków w skrypcie opakowania:

#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"

Jeśli go wywołasz wrapper.sh, parallelpolecenie wywołania będzie następujące:

parallel wrapper.sh < live_hosts

Zauważ, że nie potrzebujesz cattego rodzaju rzeczy, które zapisują zewnętrzne wywołanie programu.


2

Nie potrzebujesz parallel , ponieważ treść pętli nie zależy od poprzednich iteracji. Po prostu rozpocznij nowy proces w tle dla każdego hosta.

while read host; do
    sortstuff.sh -a "$host" > sortedstuff-"$host" &
done < live_hosts
wait    # Optional, to block until the background tasks are done

parallelułatwia jednak zarządzanie niektórymi aspektami; łatwiej można ograniczyć liczbę zadań uruchomionych równolegle.


3
Jeśli liczba wc -l live_hostsjest większa niż liczba wrzecion dyskowych lub rdzeni procesora - w zależności od tego, czy zadanie dotyczy operacji we / wy, czy procesora - zużyjesz wiele korzyści wynikających z równoległości z takim rozwiązaniem. Możliwość parallelograniczenia liczby zadań jest nie tylko przyjemna, jest prawie niezbędna, jeśli Twoim celem jest szybkość przetwarzania.
Warren Young,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.