目前,我使用一个函数来运行一个aj
连接,从一个大表到一个较小的表,它的时间列提前t
毫秒,连接sym
列和时间。然后,在从小表中删除原始连接列之前,根据这个连接列计算并以编程方式命名一个新列。这将返回带有新列的小表,该列基于提前4毫秒从大表t
连接的值。
然后使用Over循环/
在不同延迟t
的列表上重复此操作,递归地为列表中的每个延迟添加一个新列,将表作为参数传递,以便递归添加列。
我的问题是查询,连接和处理在一个大表上很慢。我有很多核心,所以我想并行化这个操作,以利用所有可用的核心,并优化添加新列所采取的步骤。大表在磁盘上由date
和sym
进行分区。
[Edit:]这是我现在有的一个例子。
smallT: ([] sym: (20#`AAPL),(20#`MSFT); time: (asc 00:00:00+20?til 100), (asc 00:00:00+20?til 100));
bigT: ([] sym: (100#`AAPL),(100#`MSFT); time: (asc 00:00:00+til 100), (asc 00:00:00+til 100); price: (til 100),(til 100));
delays: 00:00:00 + (7 * til 5);
foo: ([bigTab; smallTab2; delays]
smallTab2: aj[ `sym`time; `sym`time xasc select from (update time:time+delays from smallTab2); `sym`time xasc select sym, time, future pricesprice from bigTabl;
smallTab2: ![smallTab2; (); 0b; enlist[$"colnametime_", string(`int$delays)] ! enlist(%;`future_price;100)];
delete future_price from smallTab2
}[bigT];
smallT:foo/[select from smallT; delays];
smallT
我对q和kdb比较陌生,所以详细解释一个解决方案如何以及为什么在一个玩具示例上与工作代码一起工作将非常感激。
你的函数在循环中重复对表进行排序,这会减慢你的速度。
还如文档中所述,应该在表上应用属性,这将大大提高性能。https://code.kx.com/q/ref/aj/性能
与其循环遍历延迟偏移量,不如创建完整的列表,并且只创建一次aj
。https://community.kx.com/t5/New-kdb-q-users-question-forum/How-do-you-start-thinking-in-vectors/td-p/12722
smallT: ([] sym: (20#`AAPL),(20#`MSFT); time: (asc 00:00:00+20?til 100), (asc 00:00:00+20?til 100));
bigT: ([] sym: (100#`AAPL),(100#`MSFT); time: (asc 00:00:00+til 100), (asc 00:00:00+til 100); price: (til 100),(til 100));
delays: 00:00:00 + (7 * til 5);
bigT:update `p#sym from `sym`time xasc bigT
res:raze {[x;y] update row:i, delay:(`$"delay_",string`int$y),time+y from x}[smallT] each delays
res:update `g#sym from `sym`time xasc res
res:aj[ `sym`time;res; select sym, time, price from bigT]
delete row from `sym`time xcols 0!(exec ({`$"delay_",string`int$x} each delays)#(delay!price) by row:row from res) lj 1!select row,sym,time from res
sym time delay_0 delay_7 delay_14 delay_21 delay_28
--------------------------------------------------------
AAPL 00:00:17 17 24 31 38 45
AAPL 00:00:18 18 25 32 39 46
AAPL 00:00:18 18 25 32 39 46
AAPL 00:00:28 28 35 42 49 56
AAPL 00:00:33 33 40 47 54 61
...