2012-02-09 13 views
5

Espero que esté haciendo algo mal, pero parece que kdb no puede leer datos de canalizaciones con nombre (al menos en Solaris). Bloquea hasta que se escriben pero luego no devuelve ninguno de los datos que se escribieron.¿Se puede leer kdb desde una tubería con nombre?

puedo crear un archivo de texto:

$ echo Mary had a little lamb > lamb.txt 

y kdb felizmente leerlo:

q) read0 `:/tmp/lamb.txt 
enlist "Mary had a little lamb" 

puedo crear una canalización con nombre:

$ mkfifo lamb.pipe 

y tratar de leer de él:

q) read0 `:/tmp/lamb.pipe 

hará que kdb se bloquee. Escrito a la tubería:

$ cat lamb.txt > lamb.pipe 

hará que kdb para devolver la lista vacía:

() 

Puede KDB leer de canalizaciones con nombre? ¿Debería darme por vencido? No creo que sea un permiso (intenté configurar -m 777 en mi comando mkfifo, pero eso no hizo ninguna diferencia).

Respuesta

0

El algoritmo para read0 no está disponible para ver lo que está haciendo debajo del capó, pero, por lo que puedo ver, espera un flujo finito y no uno continuo; entonces se bloqueará hasta que reciba una señal EOF.

+0

Me complace que se bloquee, parece el comportamiento correcto para una transmisión continua, pero luego devuelve la lista vacía, en lugar de los datos que se escribieron. Es casi como si estuviera esperando EOF y luego descarta lo que haya leído antes de ese punto: s –

+0

Sí, bien podría ser el tiempo de espera. El algoritmo subyacente proporcionaría la respuesta por lo que podría valer la pena enviar un correo electrónico a [email protected] para obtener claridad sobre la situación. – algolicious

2

cuando read0 falla, con frecuencia puede simularlo con system"cat ...". (Me encontré con este principio cuando se trata de leer cosas de/proc que tampoco cooperar con read0.)

q)system"cat /tmp/lamb.pipe" 
<blocks until you cat into the pipe in the other window> 
"Mary had a little lamb" 
q) 

sólo ser conscientes de que hay una razonablemente alta en cabeza (ya que tales cosas van en q) para invocar system - se genera un proceso cáscara entera sólo para ejecutar cualquiera que sea su comando es

también podría ser capaz de hacerlo directamente con un custom C extension, probablemente llamando read(2) directamente ...

4

con el lanzamiento kdb+ v3.4 Q tiene soporte para canalizaciones con nombre: Dependiendo si y ou quiere implementar un algoritmo de streaming o simplemente leer desde la tubería de utilizar cualquiera .Q.fps o read1 en una tubería FIFO:

Para poner en práctica el streaming se puede hacer algo como:

q).Q.fps[0N!]`:lamb.pipe 

Entonces $ cat lamb.txt > lamb.pipe

se imprimir

, "María tenía un corderito"

en su sesión q. Algoritmos más significativos pueden implementarse reemplazando 0N! con una función apropiada.

Para leer el contexto de su archivo en una variable de hacer:

q)h:hopen`:fifo://lamb.pipe 
q)myText: `char$read1(h) 
q)myText 

"María tenía un corderito \ n"

Ver más sobre canalizaciones con nombre here.

Cuestiones relacionadas