我想在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
在t
上与索引的关系)
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行:
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
..