我想在 R 程序中处理 kdb 表的所有行(我使用 qserver.R)。一种方法是初始化内存处理程序,然后一次遍历所有行,如下所述:
t: select from mytable where ts>12:30:00,ts<15:00:00,price,msg="A"
t[0]
t[1]
t[2]
...
我想限制 R 中客户端/服务器调用的数量以尽可能快地循环。如何为每个调用获取多行?
注意:我在下面的回答假设这mytable
是分区数据库,但您现在t
在内存中。
另一个选项使用cut
(根据您之前的帖子使用 1,000,000 的“块”)
(`int$1e6) cut t
现在您有了所需大小的表“块”列表,您可以相应地使用。
我经常将它用于某些功能(特别是与 结合使用peach
)。
我发现一个有用的模式是:
f:`function that does something useful on chunks`
fa:`function that reaggregates up to final results`
r:fa raze f peach (`int$`size`)cut t
如果您t
真的很大(垂直/水平),出于内存原因,您可能希望避免cut
直接在表格上,但可以cut
将表格的索引列表改为适当的大小,然后将索引提供给您f
并拥有索引t
并获取您想要的内容。
下面是两种方法的快速比较(请注意,f
这里没有意义,只是为了证明cut
ont
与索引的点)
q)t:flip (`$"c",/:string til 100)!{(`int$1e7)?100} each til 100
q)\ts a:raze {select c1,c99 from x}each 1000 cut t
3827 4108103072j
q)\ts b:raze {select c1,c99 from t[x]}each 1000 cut til count t
3057 217623200j
q)4108103072j%217623200j
18.87714
q)a~b
1b
根据您之前的问题,我假设这是一个 1 人系统,那么您从 kdb 获得什么好处?为什么不完全在 R 中工作而直接在那里使用平面内存映射文件?避免不必要的复杂性和开销。如果您只想通过 R 流式传输数据,那应该很简单。
而不是 "ts>12:30:00,ts<15:00:00" 使用 "ts within (12:30:00;15:00:00)" 它更快。
您处理的块的大小越大,它的效率可能就越高。100 似乎很小。
问候,瑞恩汉密尔顿
整理后,每次返回 100 行:
\l /data/mydb
t: select from mytable where ts>12:30:00,ts<15:00:00,price,msg="A"
select [0 100] from t
select [100 100] from t
select [200 100] from t
..