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

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 g        goto-line
M-g n        next-error
M-g p        previous-error

M-g M-g      goto-line
M-g M-n      next-error
M-g M-p      previous-error

4
27.09.2017, 14:04
3 ответа

Если файлы находятся на отдельных дисках, выполните тот 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 команда является самой быстрой.

3
27.01.2020, 20:51
  • 1
    Спасибо. Я использую параллель, но она говорит что команда, не найденная. Я пытался дать ему точный тракт, но никакая удача, любые предложения –  helloworld0722 06.09.2012, 03:31

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

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

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

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

2
27.01.2020, 20:51

Вы могли бы попробовать параллель 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, корректны.

2
27.01.2020, 20:51
  • 1
    благодарит за ответ, я не вполне понял путем чтения ссылки. вот то, что я пытаюсь сделать, у меня есть команда, которая должна быть выполнена parellely и искать строки в нескольких файлах, расположенных в одном каталоге. Позволяет говорит строка, которую я ищу, "sandesh247", и у меня есть 20 файлов..., какова будет получающаяся команда? Я ценил бы, если Вы могли бы помочь, поскольку я довольно плохо знаком с оболочкой. заранее спасибо –  helloworld0722 06.09.2012, 03:16
  • 2
    предполагает каталог, в котором Ваши файлы, '/path/to/dir' (и Вы хотите искать все файлы в dir), команда: найдите/path/to/dir - тип f | параллельный %-k-j150-n 1000-m grep-H-n 'sandesh247' {} –  sandesh247 06.09.2012, 08:31
  • 3
    спасибо за Ваш ответ. Параллель может использоваться для обработки команды mulitple времена?? У меня есть сценарий, в котором я работаю, чтобы цикл выполнил команду многократно. Вы предлагаете использовать параллель? –  helloworld0722 06.09.2012, 18:18
  • 4
    Нет, причины использования a for цикл, и parallel программа, отличаются. Если for подачи Вы хорошо в Вашем текущем контексте, я предлагаю, чтобы Вы остались с ним. –  sandesh247 06.09.2012, 19:11
  • 5
    @helloworld0722 на-n0 –  Ole Tange 12.09.2012, 02:11

Теги

Похожие вопросы