2

У меня есть несколько гигабайт исходного кода.

использование рекурсивного grep для термина может занять некоторое время.

Я использую ext3.

Есть ли более быстрый способ? Будет ли поиск быстрее, и если да, то почему? Будет ли использование файловой системы, такой как XFS, давать заметно лучшие результаты?

7 ответов7

5

Вы пробовали ack? Это работает довольно хорошо здесь, на базе кода размером 1 мм +.

3

Вы можете повысить производительность с помощью agrep, который использует новый алгоритм битовой маскировки для поиска.

Если вы ищете символы, ctags или etags могут работать достаточно хорошо, чтобы создать индекс для поиска.

2

Единственный способ получить существенное улучшение по сравнению с grep - это использовать индексированную поисковую систему, такую как Strigi. Файловая система не имеет большого значения, если у вас нет огромного количества очень маленьких файлов.

1

Это должно быть на суперпользователя.

Грэппинг - не идеальное решение вашей проблемы, поскольку он выполняет линейный поиск.

Индексируйте свои файлы для поиска, используя настольное решение для индексации, такое как Beagle или Google Desktop.

1

Я не думаю, что FS будет иметь большое значение; Скорее всего, это связано с вычислениями. Вы можете проверить это, используя top чтобы увидеть, курят ли ваши процессоры.

Вы также можете опубликовать свое регулярное выражение здесь и позволить умным людям из SO иметь возможность оптимизировать его. Существует множество методов, позволяющих избежать возврата и т.д.

1

Если вам нужно только собрать подмножество файлов, используйте сначала команду find. Например, только для заголовочных файлов grep .h:

find path/to/source -name *.h -print0 | xargs -0 grep pattern 

Это будет быстрее, поскольку в большинстве случаев вы обращаетесь только к именам файлов, а не к содержимому файлов, что означает гораздо меньший доступ к диску.

1

Вот что я понимаю -

  • Вы ищете исходный код для термина
  • Вы хотели бы увидеть, какие исходные файлы используют этот термин
  • У вас, вероятно, есть тысячи файлов (в сумме до ГБ)
  • Вы хотите знать все вхождения термина в каждом файле или да / нет указание того, использовался ли он в файле или нет? (флаг -l делает это).

Вы можете использовать политику «разделяй и властвуй». Разбейте ваш набор на несколько наборов файлов, запустите несколько greps параллельно.

Не уверен, что вам нужна разовая вещь или что-то повторяющееся по своей природе.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .