Napisałem skrypt bash, który ma następujący format:
#!/bin/bash
start=$(date +%s)
inFile="input.txt"
outFile="output.csv"
rm -f $inFile $outFile
while read line
do
-- Block of Commands
done < "$inFile"
end=$(date +%s)
runtime=$((end-start))
echo "Program has finished execution in $runtime seconds."
while
Pętla będzie czytać od $inFile
wykonać pewną aktywność na linii i zrzucić wynik w $outFile
.
Ponieważ $inFile
linie mają ponad 3500 linii, wykonanie całego skryptu zajęłoby 6-7 godzin. Aby zminimalizować ten czas, planuję używać wielowątkowości lub rozwidlania w tym skrypcie. Jeśli utworzę 8 procesów potomnych, 8 wierszy z nich $inFile
zostanie przetworzonych jednocześnie.
Jak można to zrobić?
shell-script
multithreading
parallelism
Mandar Shinde
źródło
źródło
Odpowiedzi:
GNU
parallel
jest stworzony właśnie do tego rodzaju rzeczy. Możesz uruchamiać skrypt wiele razy na raz, dla każdego przesyłając różne dane z danych wejściowych:Domyślnie spawnuje procesy zgodnie z liczbą procesorów w twoim systemie, ale możesz to dostosować za pomocą
-j N
.Szczególnie zgrabną sztuczką jest funkcja owijania shebang. Jeśli zmienisz pierwszą linię skryptu Bash na:
i podaj dane na standardowym wejściu, to wszystko stanie się automatycznie. Jest to mniej przydatne, gdy masz kod czyszczenia, który musi zostać uruchomiony na końcu, co możesz zrobić.
Należy zwrócić uwagę na kilka rzeczy. Jednym z nich jest to, że podzieli dane wejściowe na sekwencyjne fragmenty i wykorzysta je pojedynczo - nie przeplata linii. Drugi polega na tym, że te fragmenty są podzielone według wielkości, bez względu na liczbę rekordów. Możesz użyć,
--block N
aby ustawić inny rozmiar bloku w bajtach. W twoim przypadku nie więcej niż jedna ósma rozmiaru pliku powinna być odpowiednia. Twój plik wygląda na to, że może być wystarczająco mały, aby skończyć w jednym bloku w przeciwnym razie, co by zniweczyło cel.Istnieje wiele opcji dla poszczególnych różnych przypadków użycia, ale samouczek omawia wszystko całkiem dobrze. Opcje, które mogą Cię również zainteresować, obejmują
--round-robin
i--group
.źródło
#!a b c
spowoduje to["b c"]
, podczas gdy w niektórych innych systemach spowoduje["b", "c"]
.GNU parallel
do skrobania stron HTML. Czy możesz przejść przez ten wątek unix.stackexchange.com/questions/277609/...