如何使用扫描副词改进桃子?

时间:2015-10-19 11:04:43

标签: kdb

我有一个时间列表,我想计算每次在给定时间窗口内有多少次。即每次,有多少次以下时间不到10分钟。

这是我到目前为止所做的,它适用于小型列表,ts< 10000,但即使使用桃子,当计数高于此值时它会挣扎,并且会得到wsfull错误。

q)ts:asc `time$10?10000000
q)ts where each {(x<=y) and (y<x+00:10)}[;ts] peach ts
00:10:20.526 00:11:41.084 00:15:59.360 00:20:15.625
00:11:41.084 00:15:59.360 00:20:15.625
00:15:59.360 00:20:15.625
,00:20:15.625
,01:11:14.831
02:14:36.999 02:17:47.700
02:17:47.700 02:25:44.267 02:27:02.389
02:25:44.267 02:27:02.389 02:28:16.790
02:27:02.389 02:28:16.790
,02:28:16.790

我尝试过使用scan和over,但是在我需要的时候无法弄清楚如何停止迭代。

1 个答案:

答案 0 :(得分:1)

编辑 - 如果它只是您之后的计数,那么您只需要:

q)1+(ts bin ts+00:10)-til count ts
1 3 2 1 1 2 2 1 1 1

老答案 - 如果您正在尝试实际生成时间列表(不确定为什么需要这样做)那么无论您做什么,您最终会吃掉一点点内存(生成大量可能很大的时间列表)。此外,桃子可能没用,因为外包到其他线程所获得的时间可能会在将结果发送回主线程所需的时间内撤消。任何形式的迭代/循环都可能很慢,因为它将以原子方式运行

话虽如此,最好的解决方案是使用bin,特别是如果您的列表已排序。例如,这两者中的任何一个都应该为您提供时间列表,并且它们可以更好地扩展(再次,如果您只是使用它们来计算,则不应该生成列表 - 请参阅上面的编辑) :

ts t+til each 1+(ts bin ts+00:10)-t:til count ts

{y[1]#y[0]_x}[ts] each t,'1+(ts bin ts+00:10)-t:til count ts

但它们仍然涉及生成索引列表的列表,它们仍然会加起来。

请注意,bin(在每个项目的10分钟内给出最后一项的索引)非常快且内存效率高,即使列表数以千万计:

q)ts:asc `time$10000000?10000000
q)
q)\ts ts bin ts+00:10
160 201326768