сценарий оболочки для чтения из нескольких файлов параллельно

Мне нужно написать скрипт, который выполняется параллельно и ищет строку в нескольких файлах.
Я попробовал много вариантов, но они замедляют скорость моего процессора.

Если файлы находятся на отдельных дисках, запустите одну команду grep на каждом диске.

Для файлов на одном диске узкое место читается с диска. Чтение из нескольких файлов параллельно приведет только к ухудшению скорости.

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

 grep file1 file2 file3 & grep file4 file5 file6 

С параллельным GNU :

 parallel -j 2 grep ::: file1 file2 file3 file4 file5 file6 

Если вы получаете файлы от find :

 find … -print0 | parallel -0 -j 2 

Помните: если файлы находятся на одном диске, одна команда grep является самой быстрой.

Я предполагаю, что ваши файлы довольно большие (в противном случае вам, вероятно, не хотелось бы распараллеливать работу).

parallel предложения GNU хороши (и в xargs GNU также есть опция -P для параллельного выполнения). Но если grepping файла (или файлов) является операцией с привязкой к I / O, а не с привязкой к CPU, вы можете обнаружить, что запуск нескольких greps параллельно замедляет работу, потому что теперь у вас есть несколько процессов, конкурирующих за доступ к диску.

Скорость ввода-вывода здесь является ограничивающим фактором, а не мощностью процессора. Даже один процесс grep, вероятно, проводит большую часть времени, ожидая данных с диска (т. Е. Процессор в основном бездействует).

Если файлы не физически близки друг к другу на диске, это может быть МНОГИЕ раза медленнее, так как головки дисков должны перемещаться намного больше (конечно, это не будет проблемой на SSD или ramdisk, или если файлы уже кэшированы)

Вы можете попробовать GNU параллельно:

 find . -type f | parallel -k -j150% -n 1000 -m grep -H -n STRING {} 

http://www.gnu.org/software/parallel/man.html#example__parallel_grep )

Изменить: обратите внимание, что другие комментарии, указывающие, что grep будет работать быстрее последовательно, если узкое место является IO, верны.