Są na to dwa proste rozwiązania. Zasadniczo za pomocą xargs
lub parallel
.
Podejście xargs:
Można skorzystać xargs
z find
co następuje:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
Gdzie zastąpisz number_of_processes
maksymalną liczbę procesów, które chcesz uruchomić. Nie gwarantuje to jednak znaczącej wydajności w przypadku ograniczonej wydajności we / wy. W takim przypadku możesz spróbować uruchomić więcej procesów w celu zrekompensowania straconego czasu oczekiwania na operacje we / wy.
Ponadto, dzięki włączeniu funkcji find, możesz określić bardziej zaawansowane opcje zamiast tylko wzorów plików, takich jak czas modyfikacji itp.
Jeden z możliwych problemów z tym podejściem, wyjaśniony w komentarzach Stéphane'a, jeśli plików jest niewiele, xargs
może nie uruchomić dla nich wystarczająco wielu procesów. Jednym z rozwiązań będzie użycie -n
opcji xargs
do określenia, ile argumentów ma pobierać z potoku na raz. Ustawienie -n1
wymusi xargs
rozpoczęcie nowego procesu dla każdego pojedynczego pliku. Może to być pożądane zachowanie, jeśli pliki są bardzo duże (jak w przypadku tego pytania) i istnieje stosunkowo niewielka liczba plików. Jeśli jednak same pliki są małe, narzut związany z uruchomieniem nowego procesu może podważyć przewagę równoległości, w którym to przypadku -n
lepsza wartość będzie lepsza. W związku z tym -n
opcja może zostać dokładnie dostosowana do rozmiaru i liczby plików.
Podejście równoległe:
Innym sposobem na to jest użycie narzędzia Ole Tange GNU Parallel parallel
(dostępne tutaj ). Zapewnia to większą kontrolę drobnoziarnistości nad równoległością, a nawet może być rozdzielone na wiele hostów (byłoby to korzystne, jeśli na przykład katalog jest udostępniany). Najprostsza składnia przy użyciu równoległości będzie:
find . -type f | parallel -j+1 grep mypattern
gdzie opcja -j+1
nakazuje równolegle rozpoczęcie jednego procesu przekraczającego liczbę rdzeni na komputerze (może to być pomocne w przypadku ograniczonych zadań we / wy, możesz nawet spróbować zwiększyć liczbę).
Równolegle ma również tę zaletę, xargs
że faktycznie zachowuje porządek wyjścia z każdego procesu i generuje ciągły wynik. Na przykład, xargs
jeśli proces 1 generuje linię powiedzmy p1L1
, proces 2 generuje linię p2L1
, proces 1 generuje inną linię p1L2
, wynikiem będzie:
p1L1
p2L1
p1L2
mając na uwadze, parallel
że wynikiem powinno być:
p1L1
p1L2
p2L1
Jest to zwykle bardziej przydatne niż xargs
wyjście.