LINUX.ORG.RU
ФорумTalks

GNU grep — тормозилово


0

0

есть 12 мегабайтный файл.

Задача банальная -- отгрепать ^NODE.

С помощью gnu awk:

$ time { cat file | awk '/^NODE/ { print }' > /dev/null; }
real    0m0.929s
user    0m0.900s
sys     0m0.020s

Даже если делать вывод в терминал, все равно это занимает всего 25 реальных секунд!

А теперь великое Тормозилово grep (GNU grep) 2.5.1 из генту:

$ time { cat file | grep '^NODE' > /dev/null; }

real    4m11.329s
user    4m0.123s
sys     0m0.692s
★★★★★

Очень приятно.

mono ★★★★★
()

В вашей консерватории однозначно что-то не так.

$ du -sh cache.log && time { cat cache.log | grep '101' > /dev/null; }
7,6M cache.log

real 0m0.030s
user 0m0.018s
sys 0m0.012s

Тоже Gentoo.

LexxTheFox ★★
()
Ответ на: комментарий от dilmah

$ grep -V grep (GNU grep) 2.5.1

Copyright 1988, 1992-1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

LexxTheFox ★★
()
Ответ на: комментарий от LexxTheFox

Ёлы. USer line breaks выбрать забыл. По сабжу: грепал гиговые логи сквида, время выполнения было вполне приемлемое.

LexxTheFox ★★
()

> из генту

Юз Слакварь, Люк. Известно, что генту собирается с оптимизацией под проц, только до сих пор не выяснено, что это за проц и где его взять.

bugmaker ★★★★☆
()

А если вместо:
time { cat file | grep '^NODE' > /dev/null; }
Сделать:
time { grep '^NODE' file > /dev/null; }
?

xtron
()
Ответ на: комментарий от LexxTheFox

то что у вас быстро -- ни о чем не говорит. Если я в том же файле ищу паттерн которого нет, то скорость приемлемая

$ time { cat file | grep '^101' > /dev/null; }

real 0m0.690s user 0m0.664s sys 0m0.024s

$ time { cat file | grep '101' > /dev/null; }

real 0m4.669s user 0m4.548s sys 0m0.008s

Паттерн ^NODE на котором греп занимает больше 4 минут -- встречается ~280 тысяч раз

dilmah ★★★★★
() автор топика
Ответ на: комментарий от ero-sennin

> А локаль у кого какая?

о, точно, это ж постоянный источник проблем. Локаль была en_US.UTF-8 и у awk (0.9 сек) и у grep (4 мин).

Сейчас поставил LC_ALL=C -- греп отработал за 60 миллисекунд

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

Дебиан etch

$ time grep '^NODE' file.log >/dev/null 

real    0m0.872s
user    0m0.828s
sys     0m0.040s

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

$ grep -c '^NODE' file.log
388838

sdio ★★★★★
()

This is GNU grep, the "fastest grep in the west" (we hope) (c)

KF
()

Пора, наверное, как Линус, переходить на другой grep ;)

Midael ★★★★★
()

У меня греп дико тормозил, когда весь файл -- одна строка.

acheron ★★★★
()

У меня fgrep ~ за такое время на raid5 парсил 1.7гб лог vsftpd O_O

mutronix ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.