У меня есть FILE_A, который имеет более 300 000 строк и FILE_B, который имеет более 30 миллионов строк. Я создал скрипт Bash, который обрабатывает каждую строку в FILE_A над FILE_B и записывает результат grep в новый файл.
Весь этот процесс занимает более 5 часов.
Как я могу улучшить производительность моего скрипта?
Я использую в grep -F -m 1
качестве команды grep. FILE_A выглядит так:
123456789
123455321
и FILE_B выглядит так:
123456789,123456789,730025400149993,
123455321,123455321,730025400126097,
Поэтому в Bash у меня есть while
цикл, который выбирает следующую строку в FILE_A и отображает ее в FILE_B. Когда шаблон найден в FILE_B, я записываю его в файл result.txt.
while read -r line; do
grep -F -m1 $line 30MFile
done < 300KFile
algorithms
performance
perl
bash
rogerio_marcio
источник
источник
Вот Perl ответ для потомков. Я обычно делаю это для сопоставления 1М строк с 30-35М линиями. Это займет около 10 секунд, чтобы закончить.
Сначала хешируем FILE_A:
Затем, если ваш большой файл разделен, и вы знаете, какой столбец нужно искать, проверьте наличие хеш-ключа при запуске FILE_B, что намного, намного быстрее, чем проверка на равенство или сопоставление регулярного выражения:
Если ваш больший целевой файл плохо анализируется, то этот скрипт теряет свою ценность, так как большая часть его скорости происходит из-за того, что не нужно запускать механизм регулярных выражений .
источник
Если вы не возражаете против более сложного программирования, подумайте об использовании деревьев суффиксов (или варианта).
Вы можете выполнить предварительную обработку,
FILE_B
используя алгоритм Укконена за линейное время. Затем вы запрашиваете каждую строку поFILE_A
времени, линейному по длине строки, и получаете все совпадающие номера строк (возможно, потребуется немного адаптировать дерево), которые вы можете записать в файл результатов.Вся процедура выполняется за время O (n + Nm), если n - это длина
FILE_B
,N
это количество строк в,FILE_A
а m - это длина самой длинной строки вFILE_A
- это, по сути, линейное время выполнения. Превосходит квадратичное время, необходимое вашему первоначальному подходу, по величинам.источник
В
--mmap
последнее время я нашла флаг, у меня не было возможности проверить его, но я буду рада услышать о ваших результатах. Вот описание со страницы руководства:Смотрите это или это для получения дополнительной информации о
mmap
.источник
--mmap
доза ничего не сбрасывает, я бы порекомендовал пробежать с--mmap
, а один без. А затем используйте,wc
чтобы увидеть, что у вас одинаковое количество выходных данных - это должен быть надежный тест, учитывая, что мы выполнили 2 раза grep, и только флаг отличался.почему бы вам не поместить этот файл в базу данных? Базы данных действительно хороши в эффективном объединении, хэше, вложенном цикле, как это. И они действительно хороши в использовании виртуальной памяти
источник