Mam problem ze skryptem powłoki, w którym dostaję katalog pełen plików wejściowych (każdy plik zawiera wiele wierszy wejściowych) i muszę przetwarzać je osobno, przekierowując każde z ich wyników do unikalnego pliku (aka, plik_1.input potrzebuje do przechwycenia w pliku_1.output itd.).
Przed równolegle , po prostu iterowałbym każdy plik w katalogu i wykonywał moje polecenie, wykonując jakąś technikę licznika / liczenia, aby nie przytłoczyć procesorów (zakładając, że każdy proces miał stały czas działania). Wiem jednak, że nie zawsze tak będzie, więc użycie rozwiązania „równoległego” wydaje się najlepszym sposobem na uzyskanie wielowątkowości skryptu powłoki bez pisania niestandardowego kodu.
Chociaż zastanawiałem się nad niektórymi sposobami równoległego przetwarzania w celu przetworzenia każdego z tych plików (i umożliwiania wydajnego zarządzania rdzeniami), wszystkie wydają się hackerskie. Mam, jak sądzę, dość łatwą w użyciu skrzynkę, więc wolałbym zachować ją tak czystą, jak to możliwe (i nic w równoległych przykładach nie wydaje się być moim problemem.
Każda pomoc będzie mile widziana!
przykład katalogu wejściowego:
> ls -l input_files/
total 13355
location1.txt
location2.txt
location3.txt
location4.txt
location5.txt
Scenariusz:
> cat proces_script.sh
#!/bin/sh
customScript -c 33 -I -file [inputFile] -a -v 55 > [outputFile]
Aktualizacja : po przeczytaniu odpowiedzi Ole poniżej udało mi się zebrać brakujące elementy do mojej równoległej implementacji. Chociaż jego odpowiedź jest świetna, oto moje dodatkowe badania i notatki, które wziąłem:
Zamiast uruchomić cały proces, pomyślałem, że zacznę od dowodu koncepcji, aby sprawdzić jego rozwiązanie w moim środowisku. Zobacz moje dwie różne implementacje (i uwagi):
find /home/me/input_files -type f -name *.txt | parallel cat /home/me/input_files/{} '>' /home/me/output_files/{.}.out
Używa find (nie ls, co może powodować problemy), aby znaleźć wszystkie odpowiednie pliki w moim katalogu plików wejściowych, a następnie przekierowuje ich zawartość do osobnego katalogu i pliku. Mój problem z góry polegał na czytaniu i przekierowywaniu (sam skrypt był prosty), więc zastąpienie go kotem było dobrym dowodem koncepcji.
parallel cat '>' /home/me/output_files/{.}.out ::: /home/me/input_files/*
To drugie rozwiązanie wykorzystuje paradygmat zmiennych wejściowych równoległych do odczytu plików, jednak dla nowicjuszy było to znacznie bardziej mylące. Dla mnie użycie find a pipe potwierdziło moje potrzeby.