Grep из массива намного медленнее, чем grep из файла - PullRequest
2 голосов
/ 05 декабря 2011

В попытке оптимизировать мой bash-скрипт я загрузил свой файл в массив и попытался оттуда выполнить grep, и я заметил, что этот grep из памяти намного, намного медленнее, чем стандартный grep из файла, даже принимая во внимание Дело в том, что дисковый ввод-вывод выводится из уравнения.

1) ОК, поэтому у меня большой файл (около 3000 строк) с парами имя = значение, это мой «кэш». Я загружаю его в массив из файла (достаточно просто)

# load to array
l_i_array_index=1
while read line
  do
  g_a_cache[$l_i_array_index]=$line
  let "l_i_array_index += 1"
  done < $g_f_cache

2) Затем я запускаю небольшой тест производительности поиска:

time for i in `seq 1 100`
  do
  for l_i_array_index in `seq 1 ${#g_a_cache[@]}`
    do
      echo ${g_a_cache[$l_i_array_index]}
    done | grep -c $l_s_search_string > /dev/null
  done

real    0m14.387s
user    0m13.846s
sys     0m1.781s

3) То же самое, но прямо из файла на диске:

time for i in `seq 1 100`
  do
  grep -c $l_s_search_string $g_f_cache > /dev/null
  done
real    0m0.347s
user    0m0.161s
sys     0m0.136s

Таким образом, производительность в 13-40 раз хуже, когда она должна быть лучше.

Мой вопрос: 1) в чем причина этого странного поведения 2) это разрешимо в bash или я должен укусить пулю и, наконец, переделать ее в Python

P.S. Тест проводится на Mac (bash v4), в Cygwin, время на ОДИН поиск составляет более секунды с обычным grep (что быстрее) и более 10 секунд с использованием метода массива. Сценарий близок к непригодному для использования ..

Ответы [ 2 ]

6 голосов
/ 05 декабря 2011

Программа grep была сильно оптимизирована на протяжении многих лет ведущими экспертами в области поиска и разработки алгоритмов. Вы просто не собираетесь победить его с помощью сценария оболочки. Это абсурдное понятие.

Я, честно говоря, не могу себе представить, почему вы ожидаете, что будете где-то так быстро, как grep. Возможно, вы думаете, что все дисковые операции ввода / вывода grep на самом деле требуют каких-либо действий с реальным физическим диском. Но это не так. Каждая современная операционная система имеет дисковый кеш, и файл будет в кеше после первого чтения, что занимает крошечную долю секунды.

1 голос
/ 05 декабря 2011

Это может иметь какое-то отношение к кэшам файловой системы, что приводит к тому, что «оптимизированная» реализация фактически добавляет издержки.

Кеши файловой системы можно наблюдать в следующих случаях:

localhost elhigu$ time grep -r "testnottofind" * 
real    0m22.468s
user    0m0.172s
sys 0m0.828s
localhost elhigu$ time grep -r "testnottofind" * 
real    0m0.826s
user    0m0.087s
sys 0m0.232s
localhost elhigu$ time grep -r "testnottofind2" * 
real    0m0.285s
user    0m0.084s
sys 0m0.190s
localhost elhigu$ time grep -r "moretesting" * 
real    0m0.285s
user    0m0.086s
sys 0m0.185s
localhost elhigu$ 

есть ещеинформация https://unix.stackexchange.com/questions/8914/does-grep-use-a-cache-to-speed-up-the-searches.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...