M-xgrep
в Emacs затем я могу использовать обычные ключи для следующего ссылки, представляющие найденные соответствия и также обычные ключи Emacs общего назначения для переключения между буферами назад и вперед (или для того, что я хочу).
Можно также изучить специализированные ключи для перехода к следующему соответствию.
"Специализированный" ключ для перехода сразу к следующему найденному соответствию довольно легко помнить: это - M-g n (перейдите к следующему) (или C-x') для next-error
. next-error
команда, которая более общего назначения, чем только для grep
; от справки (на C-h k M-g n):
[Это] обычно использует последний раз запущенную компиляцию, grep, или происходите буфер.
(Действительно, сначала я изучил это для ЛАТЕКСА "компиляция".)
Больше генерала "переходит к" командам, связанным с ключами в моем Emacs (согласно M-g C-h):
Global Bindings Starting With M-g: key binding --- ------- M-g ESC Prefix Command M-g ggoto-line
M-g nnext-error
M-g pprevious-error
M-g M-ggoto-line
M-g M-nnext-error
M-g M-pprevious-error
Если файлы находятся на отдельных дисках, выполните тот grep
команда на каждом диске.
Для файлов на том же диске узкое место читает из диска. Чтение из нескольких файлов параллельно только сделает скорость хуже.
Если файлы находятся на RAID 0 массивов, Вы могли бы получить увеличение скорости путем выполнения два grep
команды одновременно. Сравнительный тест, чтобы видеть, выигрываете ли Вы действительно время. Не использующий высокие технологии путь:
grep file1 file2 file3 &
grep file4 file5 file6
parallel -j 2 grep ::: file1 file2 file3 file4 file5 file6
Если Вы получаете файлы от find
:
find … -print0 | parallel -0 -j 2
Помните: если файлы находятся на том же диске, сингле grep
команда является самой быстрой.
Я предполагаю, что Ваши файлы являются довольно большими (иначе, Вы, вероятно, не заботились бы о параллелизации задания).
GNU parallel
предложения хороши (и GNU xargs
также имеет a -P
опция для параллельного выполнения), НО, учитывая, что захват файла (или файлов) является операцией I/O-bound, не зависящей от ЦП, можно найти, что выполнение нескольких властей параллельно на самом деле замедляет вещи, потому что у Вас теперь есть несколько процессов, конкурирующих за доступ к диску.
Скорость ввода-вывода является ограничивающим фактором здесь, не мощностью ЦП. Даже единственный процесс grep, вероятно, проводит большую часть своего времени, ожидая данных из диска (т.е. ЦП главным образом неактивен).
Если файлы не физически друг близко к другу на диске, это могло бы быть Много раз медленнее, поскольку головки диска должны переместиться намного больше (конечно, это не было бы проблемой на SSD или электронном диске или если файлы уже кэшируются),
Вы могли бы попробовать параллель 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, корректны.
for
цикл, и parallel
программа, отличаются. Если for
подачи Вы хорошо в Вашем текущем контексте, я предлагаю, чтобы Вы остались с ним.
– sandesh247
06.09.2012, 19:11