¿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 bufque lea su entrada lo más rápido posible, almacenándola en la memoria para que consumerpueda tomar su tiempo dulce mientras se producerejecuta lo más rápido posible.

stdbufherramienta parece ser unsizeparámetro. Sin embargo, no estoy seguro de si funciona.Respuestas:
La
pvutilidad (visor de tuberías) puede hacer esto (con la-Bopció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.pvcientos 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 ambospvextremos sean suaves (aunque uno está 1 GB por delante). No funciona de esta manera, a diferencia dembufferpuedes usar
dd:Está disponible en todos los Unix.
fuente
pvprobablemente sea más agradable de usar (muestra el progreso).ddsolo 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 siquierapvfunciona 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 elbstamañ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 losddbloques en la salida en lugar de continuar con la entrada. Usaroflag=nonblockno 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 veceslessya 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