У меня есть каталог, содержащий более 80 ГБ баз данных простых текстовых файлов, которые, как я ожидаю, придется часто просматривать. По этой причине я пытаюсь создать несколько тестов для сравнения GNU grep
с тем, что, насколько я могу судить, является самой быстрой альтернативой ему в настоящее время в дикой природе - ripgrep - чтобы определить, какой из них будет работать быстрее всего мои данные.
Первый тест будет состоять из трех циклов for
, запускающих grep
, rg
и grep -F
для текстового файла объемом 15 ГБ, а второй тест будет представлять собой серию одинаковых команд, выполняемых для всех данных. После нескольких дней постоянных циклов между использованием моих собственных ограниченных знаний bash
, поиском решений и устранением ошибок, мне удалось собрать воедино следующее для первого теста (который также будет переназначен для второго теста):
for i in {1..15}; \
do (time LC_ALL=C grep -i "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 |
tee -a "../grep Test 1.txt"; \
done; \
for i in {1..15}; \
do (time rg -i "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 |
tee -a "../ripgrep Test 1.txt"; \
done;
for i in {1..15}; \
do (time LC_ALL=C grep -Fi "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 |
tee -a "../grep -F Test 1.txt"; \
done;
Это некрасиво, но работает точно так, как задумано. Он выполняет все три цикла for
один за другим, каждый из которых выполняет поиск 15 раз для длинной строки, которая никогда не будет найдена, а затем печатает вывод time
для каждого grep
как в STDOUT
и в файл.
Однако, поскольку я бенчмаркинг, я хочу убедиться, что код подходит для точного тестирования (относительной) скорости моих вариантов использования в системе POSIX/bash/Cygwin, и что я ничего не пропускаю, что могло бы исказить результаты я получаю. В частности, такие вещи, как кэширование, дисковый ввод-вывод и другие соображения, о которых я не знаю. Я также приветствовал бы любые предложения, которые заставили бы его вести себя более надежно \ выглядеть менее уродливым.