grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
Działa to od godziny na dość potężnym serwerze linuxowym, który inaczej nie jest przeciążony. Jakaś alternatywa dla grepa? Coś w mojej składni, które można poprawić (egrep, fgrep lepiej?)
Plik faktycznie znajduje się w katalogu, który jest współdzielony z montowaniem na innym serwerze, ale rzeczywisty obszar dysku jest lokalny, więc nie powinno to robić żadnej różnicy?
grep pochłania do 93% procesora
-i
przełącznik może spowolnić proces, spróbuj bez-i
lub z włączeniemLC_ALL=C grep ...
. Ponadto, jeśli grepujesz tylko dla ustalonego ciągu, użyjgrep -F
.cindex .
aby zindeksować bieżący foldercsearch db_pd.Clients
.Odpowiedzi:
Oto kilka opcji:
1) Przedrostek polecenia grep z,
LC_ALL=C
aby użyć ustawień regionalnych C zamiast UTF-8.2) Używaj,
fgrep
ponieważ szukasz stałego ciągu znaków, a nie wyrażenia regularnego.3) Usuń
-i
opcję, jeśli jej nie potrzebujesz.Więc twoje polecenie staje się:
Będzie to również szybsze, jeśli skopiujesz plik na dysk RAM.
źródło
grep -F
więcej niżfgrep
LANG=C
(zamiastLC_ALL=C
) wystarczy i jest łatwiejszy do wpisania.fgrep
to inny sposób pisaniagrep -F
, jakman fgrep
Ci powie. Niektóre wersjeman
twierdzą również, że ta pierwsza jest przestarzała dla drugiej, ale krótsza forma jest zbyt wygodna, aby umrzeć.Jeśli masz procesor wielordzeniowy, naprawdę poleciłbym równoległe GNU . Aby równolegle grepować duży plik:
W zależności od dysków i procesorów odczyt większych bloków może być szybszy:
Nie jest to do końca jasne, ale inne opcje
grep
obejmują:-i
flagi.-F
flagi dla ustalonego ciąguLANG=C
-m
flagi.źródło
--pipepart
zamiast--pipe
. Jest znacznie szybsza.<
znak poprzedzający polecenie równoległe?cat file.sql | parallel ...
ale unika UUOC . Równoległe GNU ma również sposób na odczyt danych wejściowych z pliku przy użyciuparallel ... :::: file.sql
. HTH.Niektóre trywialne ulepszenia:
Usuń opcję -i, jeśli możesz, niewrażliwość na wielkość liter jest dość powolna.
Zastąp
.
przez\.
Pojedynczy punkt to symbol wyrażenia regularnego pasujący do dowolnego znaku, który również jest wolny
źródło
Dwie linie ataku:
-i
, czy masz możliwość się go pozbyć?grep
jest jednowątkowy, więc możesz chcieć rozpocząć ich więcej z różnymi przesunięciami.źródło
Jeśli chcesz wyszukać wiele ciągów, grep -f strings.txt oszczędza mnóstwo czasu. Powyższe jest tłumaczeniem czegoś, co obecnie testuję. wartości opcji -j i -n wydawały się działać najlepiej w moim przypadku użycia. -F grep również zrobił dużą różnicę.
źródło