使用Q/kdb逐行对比两表时遇大数据量超时问题求助
解决Kdb+中大数据量表逐行对比超时问题
问题背景
对比两个列结构相同的表的逐行数据,使用匹配运算符~或逐行循环对比时,在数据量较大的场景下出现超时。示例表如下:
tab1:([] col1:1 2 3; col2: `a`b`c) tab2:([] col1:1 3 5; col2: `a`d`b)
优化方案
kdb+的性能核心是向量化操作,逐行循环或逐行调用~属于解释执行,大数据量下效率极低,改用列级批量对比再合并结果的方式可以解决超时问题:
步骤1:生成各列的匹配掩码
对两个表的对应列逐一做相等对比,生成每列的布尔匹配向量:colMatches: {x = y} each tab1, tab2这里
tab1, tab2会按列顺序将两个表的列配对,each遍历每一对列生成布尔向量(对应位置元素相等为1b,不等为0b)。步骤2:合并列掩码得到逐行匹配结果
使用all函数逐行合并所有列的匹配结果,只有当某一行所有列都匹配时,结果才为1b:rowMatches: all colMatches上述两步可以简化为一行:
rowMatches: all {x = y} each tab1, tab2步骤3:提取不匹配行(可选)
如果需要查看具体不匹配的行,用where过滤即可:// tab1中不匹配的行 tab1Mismatches: tab1 where not rowMatches // tab2中对应的不匹配行 tab2Mismatches: tab2 where not rowMatches
关键说明
这种向量化操作是C级别的执行效率,远高于逐行循环或逐行调用~的方式,完全适配大数据量场景。
内容的提问来源于stack exchange,提问作者Karun Ch
相关产品推荐
相关产品推荐

