¿Hay alguna utilidad que pueda incluir en una tubería para desacoplar las velocidades de lectura y escritura?
$ producer | buf | consumer
Básicamente, quiero una utilidad buf
que lea su entrada lo más rápido posible, almacenándola en la memoria para que consumer
pueda tomar su tiempo dulce mientras se producer
ejecuta lo más rápido posible.
stdbuf
herramienta parece ser unsize
parámetro. Sin embargo, no estoy seguro de si funciona.Respuestas:
La
pv
utilidad (visor de tuberías) puede hacer esto (con la-B
opción) y mucho más, incluso darle informes de progreso.fuente
producer | tee >(pv -cB $SIZE | consumer1) | pv -cB $SIZE2 | consumer2
), esto puede causar ralentizaciones nuevamente.pv
cientos de veces y nunca supe esto. Muy impresionante, gracias!pv -B 4096 -c -N in /dev/zero | pv -q -B 1000000000 | pv -B 4096 -c -N out -L 100k > /dev/null
- Espero que ambospv
extremos sean suaves (aunque uno está 1 GB por delante). No funciona de esta manera, a diferencia dembuffer
puedes usar
dd
:Está disponible en todos los Unix.
fuente
pv
probablemente sea más agradable de usar (muestra el progreso).dd
solo almacena un bloque a la vez, por lo que solo retrasaría todo por la cantidad de tiempo que lleva producir el tamaño del bloque; Por favor corrígeme si estoy equivocado. Además, ¿se puede extender este almacenamiento en búfer a un tamaño ilimitado, o solo lo que se haya ingresado para el tamaño de bloque?Echa un vistazo a mbuffer . Puede almacenarse en la memoria o en el archivo de memoria asignado (
-t
/-T
).fuente
Esto es básicamente una respuesta negativa. Parece que ni
dd
, nimbuffer
, ni siquierapv
funciona son todos los casos, en particular si la tasa de datos generados por el productor puede variar mucho. Doy algunos casos de prueba a continuación. Después de escribir el comando, espere unos 10 segundos, luego escriba>
(para ir al final de los datos, es decir, espere al final de la entrada).Aquí, después de escribir
>
, hay que esperar 5 segundos, lo que significa que el productor (secuencia de comandos zsh) ha bloqueado antes quesleep 5
. Aumentar elbs
tamaño a, por ejemplo, 32M no cambia el comportamiento, aunque el búfer de 32MB es lo suficientemente grande. Sospecho que esto se debe a que losdd
bloques en la salida en lugar de continuar con la entrada. Usaroflag=nonblock
no es una solución porque esto descarta datos.Con
mbuffer
, el problema es que la primera línea (foo0) no aparece inmediatamente. No parece haber ninguna opción para habilitar el almacenamiento en línea en la entrada.Con
pv
, el comportamiento es similar add
. Peor aún, sospecho que hace cosas incorrectas al terminal, ya que a vecesless
ya no puede recibir información del terminal; por ejemplo, no se puede abandonar conq
.fuente
Movimiento no estándar: uso de amortiguadores de enchufe.
Ejemplo:
Implementado dos herramientas adicionales para esto: buffered_pipeline y mapopentounixsocket
fuente