Narzędzie unix find(1)
jest bardzo przydatne, pozwalając mi wykonać akcję na wielu plikach, które pasują do określonych specyfikacji, np
find /dump -type f -name '*.xml' -exec java -jar ProcessFile.jar {} \;
Powyższe może uruchomić skrypt lub narzędzie na każdym pliku XML w określonym katalogu.
Powiedzmy, że mój skrypt / program zajmuje dużo czasu procesora i mam 8 procesorów. Byłoby miło przetwarzać do 8 plików jednocześnie.
GNU make pozwala na równoległe przetwarzanie zadań z -j
flagą, ale find
wydaje się, że nie ma takiej funkcjonalności. Czy istnieje alternatywna ogólna metoda planowania zadań, która się do tego zbliża?
-P
opcję!xargs -P
- ma nigdy nie naprawiony błąd zniekształcania wyjścia (w przeciwieństwie doparallel
), ilekroć 2 wątki generują wyjście w tym samym momencie ...GNU równoległy też może pomóc.
Zauważ, że bez
-j8
argumentuparallel
domyślnie jest liczba rdzeni na twoim komputerze :-)źródło
Nie trzeba „naprawiać”
find
- wykorzystajmake
się do obsługi równoległości.Poproś proces o utworzenie pliku dziennika lub innego pliku wyjściowego, a następnie użyj pliku Makefile:
i przywołał w ten sposób:
Co więcej, jeśli upewnisz się, że plik wyjściowy zostanie utworzony tylko po pomyślnym zakończeniu procesu Java, możesz skorzystać z
make
obsługi zależności, aby następnym razem zrobić tylko nieprzetworzone pliki.źródło
Znajdź ma opcję równoległą, której można użyć bezpośrednio za pomocą symbolu „+”; nie wymaga Xargs. Łącząc go z grep, może szybko rozerwać twoje drzewo, szukając zapałek. na przykład, jeśli szukam wszystkich plików w moim katalogu źródeł zawierających ciąg „foo”, mogę wywołać
find sources -type f -exec grep -H foo {} +
źródło
-exec command +
składnia nie uruchamia go równolegle, ale „grupuje” wiele plików razem i uruchamia polecenie z wieloma plikami jako argumentami jednocześnie. Zdarza się, że grep może równolegle przeglądać swoje cele.