Добавьте большой буфер в канал между двумя командами

Добавьте большой буфер в канал между двумя командами

19.12.2011 12:28:57 Просмотров 18 Источник

Дана командная строка bash формы

commandA | commandB

Я хочу добавить буфер размером ~1 МБ, который находится между commandAи commandB. Я ожидал бы, что смогу сделать это с чем-то из формы

commandA | BUFFER | commandB

но какую команду использовать для BUFFER?

Замечание: я хочу сделать это для того, чтобы разделить две команды, чтобы сделать их лучше распараллеливаться. Проблема заключается в том, что commandBобрабатывает данные большими кусками, что в настоящее время означает, что commandAблокирует, пока commandBне закончит с куском. Так что все идет последовательно :-(

У вопроса есть решение - Посмотреть?

Ответы - Добавьте большой буфер в канал между двумя командами / Add a big buffer to a pipe between two commands

Является ответом!
Eugen Rieck

19.12.2011 12:32:58

Буфер называется буфером. (man 1 buffer, возможно, после apt-get install buffer)

https://stackoverflow.com/questions/8554568/add-a-big-buffer-to-a-pipe-between-two-commands/8554595#comment25018066_8554595
Какие варианты нужно передать в буфер, чтобы получить, например. Размер буфера 1 ГБ ? Там, кажется, есть много вариантов, чтобы настроить размер блока, количество блоков и все такое, но мне не ясно, какие из них использовать, чтобы получить простой буфер заданного размера.
https://stackoverflow.com/questions/8554568/add-a-big-buffer-to-a-pipe-between-two-commands/8554595#comment25024550_8554595
-m sizeдля общего числа. Если вам нужен более мелкозернистый контроль, используйте-s blocksize -b blocksвместе.
sehe

19.12.2011 01:34:43

Вы можете использовать

  • буфер (упомянутый)
  • mbuffer (работает также на solaris, возможно, другие Униксы)

Например.

    process1 | mbuffer -m 1024M | process2

чтобы использовать буфер 1г

https://stackoverflow.com/questions/8554568/add-a-big-buffer-to-a-pipe-between-two-commands/8554993#comment79956889_8554993
mbuffer кажется намного лучше, чем buffer, так как буфер (согласно manpage и моим экспериментам) ограничен 1 ГБ.
Samus_

19.12.2011 01:40:13

в качестве альтернативы можно использовать именованный канал и запускать их параллельно:

mkfifo myfifo
commandB < myfifo &
commandA > myfifo
rm myfifo
https://stackoverflow.com/questions/8554568/add-a-big-buffer-to-a-pipe-between-two-commands/8555027#comment39101159_8555027
Вот только буферы около 64КБ - не большие.
https://stackoverflow.com/questions/8554568/add-a-big-buffer-to-a-pipe-between-two-commands/8555027#comment87991874_8555027
Это решение имеет тот же размер буфераcommandA | commandB.
Johannes Gerer

13.10.2016 12:32:35

Есть еще один инструмент, pv-pipe viewer:

process1 | pv -pterbTCB 1G | process2
  • Bзадает размер буфера, здесь 1 гигабайт
  • Cотключает splice, которое требуется для B
  • Tпоказывает уровень буфера
  • pterb-это переключатели дисплея по умолчанию, необходимые из-за наличия T

pvможет быть доступен на системах, где mbuffer/bufferне находится в официальных репозиториях (таких как arch linux).

ceving

28.01.2020 08:22:37

Буфер программы buffer:

dd

Важно использовать commandA | dd status=none iflag=fullblock bs=1M | commandB может привести к потере данных при чтении из канала.

Закрыть X