首页 文章

kdb / q优化联合函数

提问于
浏览
1

给你一点背景知识 . 我有一个进行这种大型复杂计算的过程需要一段时间才能完成 . 它运行在计时器上 . 经过一番调查后,我发现造成缓慢的原因不是实际计算,而是内部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 回答

  • 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

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

    如果以上是真的,我建议你重写你的表的模式,这样可以最小化你的symfile上的rehashing(不确定这是不是正确的术语!) . 或者,如上所述,尝试为您的表分配属性..这可能会减少时间 .

相关问题