2010-06-28 7 views
6

Una conexión PipedInputStream/PipedOutputStream funciona muy bien cuando los datos solo necesitan ser canalizados a una salida, pero si múltiples flujos de salida están conectados a una corriente de entrada, los datos se vuelven fragmentado a través de las diferentes salidas. Mi solución actual implica tener un "lector" enhebrado que lee datos de un InputStream y luego escribe los datos en objetos OutputStream que se han asociado con el lector. Esto parece funcionar bien, pero parece desordenado e ineficiente en comparación con las clases nativas PipedIO.La mejor manera de canalizar datos de una corriente de entrada a múltiples flujos de salida

¿Existe una forma mejor de manejar esto o la implementación con la que estoy trabajando es tan buena como la que obtendré?

Respuesta

1

Si un flujo de entrada debe ser leído por múltiples consumidores, y el flujo de entrada es efímero (es decir, no es un recurso que puede rebobinarse o admite múltiples punteros de entrada), generalmente deberá proporcionar un esquema de almacenamiento en búfer que se comporta como si retuviera cada elemento de datos hasta que todos los consumidores lo hayan leído.

Tiene varias opciones de implementación. Lo más simple es lo que sugieres, con la sobrecarga siendo principalmente el espacio de almacenamiento para copias múltiples de los datos en los buffers de salida. Si el almacenamiento es un problema, podría proporcionar un único búfer que mantenga punteros de lectura separados, uno para cada consumidor, y mantenga en memoria solo los datos entre los punteros de lectura más bajos y más altos. Si los consumidores leen datos a velocidades muy diferentes, podría terminar con la mayoría o la totalidad de los datos de entrada en la memoria, momento en el que sería necesario algún tipo de estrangulamiento de entrada, o un esquema intermedio de almacenamiento en memoria intermedia del disco.

Supongo que el flujo de entrada único no es persistente (es decir, un archivo en el disco) ... en ese caso, la solución es trivial.

+0

Gracias por la respuesta. Tiene razón al suponer que los datos no son persistentes. Básicamente, estoy leyendo datos de una conexión SSH para fines de verificación. I buffer las respuestas del comando para que puedan verificarse contra el comportamiento esperado, escribir datos en un registro de depuración según sea necesario y escribir todos los datos en una GUI para fines de monitoreo. Dado que realmente solo estoy preocupado por el almacenamiento en búfer de pequeñas cantidades de datos para la respuesta del comando, creo que voy a seguir con mi método actual o el método múltiplex anterior a menos que haya otras sugerencias. – WeeTodd

0

Código de estilo anterior, this will give you a good starting place.

+0

Gracias por la respuesta. ¿Tiene alguna información adicional sobre qué tan bien funcionaría esto al tener que hablar a través de los hilos en comparación con mi solución actual? Intenté jugar con la canalización de los datos de entrada a una secuencia de salida múltiple, pero el rendimiento parece ser lento y no tan confiable. – WeeTodd

+0

@WeeTodd Probablemente necesite comparar las diferentes soluciones. Recomendaría seguir adelante y luego ver las diferentes opciones si se encuentra con problemas de rendimiento. Haga que sea tan fácil reemplazar las implementaciones –

Cuestiones relacionadas