2

我想在 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 中客户端/服务器调用的数量以尽可能快地循环。如何为每个调用获取多行?

4

3 回答 3

1

注意:我在下面的回答假设这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这里没有意义,只是为了证明cutont与索引的点)

   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
于 2013-09-05T17:07:04.277 回答
1
  1. 根据您之前的问题,我假设这是一个 1 人系统,那么您从 kdb 获得什么好处?为什么不完全在 R 中工作而直接在那里使用平面内存映射文件?避免不必要的复杂性和开销。如果您只想通过 R 流式传输数据,那应该很简单。

  2. 而不是 "ts>12:30:00,ts<15:00:00" 使用 "ts within (12:30:00;15:00:00)" 它更快。

  3. 您处理的块的大小越大,它的效率可能就越高。100 似乎很小。

问候,瑞恩汉密尔顿

于 2013-06-07T19:53:59.040 回答
0

整理后,每次返回 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
..
于 2013-06-07T19:49:17.497 回答