kdb + / q优化联合函数

时间:2017-08-16 21:09:37

标签: kdb

为您提供一些背景信息。我有一个进行这种大型复杂计算的过程需要一段时间才能完成。它运行在计时器上。经过一番调查后,我发现造成缓慢的原因不是实际计算,而是内部q函数,联合。

我正在尝试联合两个简单的表,表A和表B.A大约是5米行,B是500.两个表只有两列。第一列是符号。表A实际上是表的复合主键。 (另外,如何直接从控制台复制?)

n:5000000
big:([]n?`4;n?100)
small:([]500?`4;500?100)
\ts big union small 

我尝试键入两个列并进行插入,加入然后区分“大,小而不小”,但似乎没有任何作用:(

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

如果要挂起big表,则必须对其进行键控,并且应使用upsert运算符。例如

n:5000000
//big ids are unique numbers from 0 to 499999
//table is keyed with 1! operator
big:1!([]id:(neg n)?n;val:n?100)
//big ids are unique numbers. 250 from 0-4999999 and 250 from 500000-1000000 intervals
small:([]id:(-250?n),(n+-250?n);val:500?100)

如果big是全局变量,则将其置为

是有效的
`big upsert small

如果big是本地的

big: big upsert small

结果big将包含500250个元素,因为大表和小表中有250个公共键(id列)

答案 1 :(得分:1)

这可能不相关,但只是一个快速的想法。如果你的大表有一个类型为`sym的列,并且如果这个列在整个程序中没有真正显示那么多,为什么不将它转换为字符串或其他值?如果你每天都在进行这个更新过程,那么随着数据被打包在你的分区hdb中,每当添加新数据时,kdb + process必须重新分配/重写它的sym文件,我相信这是实际需要很多的部分时间,而不是工会计算本身..

如果上面的情况属实,我建议重新编写表格的模式,这样可以最大限度地减少你的symfile上的重复#(不确定这是否是正确的术语!)。或者,如上所述,尝试为您的表分配属性..这可能会减少时间。