есть файл filelists.txt
/DATA/cache/00/01/0011AABB
/DATA/cache/00/0B/02345678
/DATA/cache/00/0B/00FEDCBA
~300тыс записей.
и patterns.lst
02345678
00FEDABC
00FEDA43
порядка 50тыс записей
надо найти все такие записи из filelist.txt, в которых есть хоть слово из patterns.lst
обычно делается командой:
grep -f patterns.lst filelists.txt
можете сгенерировать входные данные и оценить: процесс сожрал порядка 60мб оперативки и работал в течении 40 минут на P4 2.8GHz...
поэтому мы пошли другим путем: сформировали (на перле) из patterns.lst строчку в виде 02345678|00FEDABC|00FEDA43... и т.д. (на все ~40кб), слава Столлману оно влезло в 128 кб ограничения длины параметра оболочки.
и вснунули это в переменную $PATTERN
egrep "($PATTERN)" filelists.txt
потребовалось 400мб оперативной памяти, где-то секунд 20 работы, и получил результат.
это выиграло даже у варианта на чистом перле:
time perl -e'open I, q/filelists.txt/; while (<I>) {chomp; push @R, $_}; $c=join(q/|/, @R); open I, q/patterns.lst/; while (<I>) {print if /($c)/}' >11.txt
real 17m10.618s
user 17m10.075s
sys 0m0.