通过其句柄读取文件

时间:2020-05-18 11:17:17

标签: kdb k

q可以创建文件并以一种很好的方式将其内容读回:

q)`:foo 0: ("bar";"baz")
`:foo
q)`:foo 0::
"bar"
"baz"

https://code.kx.com/q/ref/read0/说,没有人可以使用read0file or process handle获取数据。但是由于某种原因,我无法从文件的句柄中获取任何数据。在q)read0[h]之后看不到任何输出:

q)h:hopen `:foo
q)read0[h]
q)hclose h

此外,在.Q.fsn的每一步中,它都使用1:(s;x;n)读取下一部分数据,但不是通过打开的句柄(像其他编程语言一样)来读取数据:

k)fsn:{[f;s;n]
 >[-7!s]
 {[f;s;x;n]
  i:(#r)^1 + last@&"\n"=r:1:(s;x;n);
  f@`\:i#r;
  x+i
 }[f;s;;n]/0}

因此可以使用这样一种方法:使用1:中的0:read00::中的qgen1day:{[date;n] ([] sourcetime:`timestamp$date+asc 09:00:00.0 + n?08:00:00.0; inst:n?(1000?`4); price:n?100f; size:n?10000; e1:n?20; x:n?(`N`O`L`X); e2:n?10) } /memory, strings ("PSFJJSJ";enlist"|") 0: "|" 0: gen1day[2020.01.01;5] /disk, `:t0 file ("PSFJJSJ";enlist"|") 0: read0 `:t0 0: "|" 0: gen1day[2020.01.01;5] )来读取文件中的数据它们的名称(符号),而不是通过打开手柄来阅读它们。为何无法从打开的手柄中读取内容?但是通过文件句柄写入是可以的。


更新: 谢谢@CallumBiggs!

太好了!没有句柄,它看起来像是一个坚固且对称的api,例如:

{{1}}

1 个答案:

答案 0 :(得分:2)

关于第一个问题,read0可以从system or process句柄而非文件句柄读取。即可以从标准输入中读取数据。

我的上述观点确实回答了您的第二个问题,您应按文件名阅读,而不要打开句柄。

关于您为何无法从打开的句柄读取,但可以从它们中写(And why one could not read from an open handle)的陈述。这是由于两个因素造成的,即kdb中的重载和约定。 kdb中的约定是句柄用于在kdb中发送数据,而不是请求它们。我相信当您使用`:path/to/file进行交互时,kdb确实会打开文件句柄,我相信这会被运算符重载隐藏。您可以检查/proc/PID/fd/以确定句柄是否打开

相关问题