在客户机应用程序中迭代kdb分区表的正确方法是什么?



我想在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表的索引列表到适当的大小,然后将索引提供给你的ft的索引,并抓取你想要的。

下面是两种方法的快速比较(注意,这里的f是没有意义的,只是为了证明cutt上与索引的关系)

   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. 从你之前的问题来看,我假设这是一个1人系统,那么你从kdb中得到了什么好处?为什么不在R中完全工作,直接使用平面内存映射文件呢?避免不必要的复杂性和开销。

  2. 如果你想做的只是按顺序通过R流数据,那应该很简单。
  3. 不要用"ts>12:30:00,ts<15:00:00",用"ts within(12:30:00;15:00:00)",这样更快。

  4. 处理的块大小越大,效率可能越高。

问候,瑞安·汉密尔顿

排序后,每次返回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
..

相关内容

最新更新