Есть ли утилита, которую я могу вставить в конвейер для разделения скоростей чтения и записи?
$ producer | buf | consumer
По сути, мне нужна утилита, buf
которая считывает входные данные как можно быстрее, сохраняя их в памяти, чтобы они consumer
могли занимать приятное время и producer
работать как можно быстрее.
stdbuf
Инструмент , как представляетсяsize
параметр. Я не уверен, что это работает, хотя.Ответы:
pv
(Зритель труба) утилита может это сделать (с-B
опцией) и многое другое, в том числе предоставляя вам отчеты о ходе работ.источник
producer | tee >(pv -cB $SIZE | consumer1) | pv -cB $SIZE2 | consumer2
), это может снова вызвать замедление.pv
сотни раз и никогда не знал этого. Очень круто, спасибо!pv -B 4096 -c -N in /dev/zero | pv -q -B 1000000000 | pv -B 4096 -c -N out -L 100k > /dev/null
- Я ожидаю, что обаpv
s на концах будут гладкими (хотя на 1 ГБ впереди). Это не работает таким образом, в отличие отmbuffer
Вы можете использовать
dd
:Это доступно на каждом Unix.
источник
pv
, вероятно, лучше использовать (показывает прогресс).dd
хранится только один блок за раз, поэтому он просто задержит все на количество времени, необходимое для получения размера блока; Пожалуйста, поправьте меня, если я ошибаюсь. Кроме того, можно ли расширить эту буферизацию до неограниченного размера или только для того, что введено для размера блока?Посмотрите на mbuffer . Он может буферизовать в память или отображенный в память файл (
-t
/-T
).источник
Это в основном отрицательный ответ. Похоже, что ни
dd
, ниmbuffer
, ни дажеpv
работает не все случаи, в частности, если скорость данных, генерируемых производителем, может сильно различаться. Я даю несколько тестов ниже. После ввода команды подождите около 10 секунд, затем введите>
(чтобы перейти к концу данных, то есть дождаться окончания ввода).Здесь после ввода
>
нужно подождать 5 секунд, что означает, что производитель (сценарий zsh) заблокирован передsleep 5
. Увеличениеbs
размера, например, до 32 МБ, не меняет поведение, хотя буфер 32 МБ достаточно велик. Я подозреваю, что это потому, чтоdd
блоки на выходе вместо того, чтобы продолжать с ввода. Использованиеoflag=nonblock
не является решением, потому что это отбрасывает данные.С
mbuffer
, проблема заключается в том , что первая строка (foo0) не появляется сразу. Кажется, нет никакой возможности включить буферизацию строки на входе.С
pv
поведением похожеdd
. Хуже того, я подозреваю, что это неправильно для терминала, так как иногдаless
больше не может получать входные данные от терминала; например, с ним нельзя выйтиq
.источник
Нестандартный ход: использование буфера сокетов.
Пример:
Для этого реализованы два дополнительных инструмента: buffered_pipeline и mapopentounixsocket
источник