KDB中如何将外部传入符号参数用作变量名加载文件
KDB 参数化加载指定区域数据
我需要从KDB外部进程传入一个符号,用该符号创建变量——如果变量不存在,就加载指定文件。
先看创建示例数据并写入磁盘的代码:
// 创建示例数据并写入磁盘 .data.area52.varName1: ([] name:`billy`allen`terry; val:90 100 200); .data.area52.varName2: 10 #200; .data.area53.varName1: 9 #100; .data.area53.varName2: ([] name:`joe`jim`bob; val:10 20 30); .data.area53.varName3: `random; `:area52 set .data.area52; `:area53 set .data.area53;
我的需求是传入area52这类参数,判断.data下对应的变量是否存在:存在则不处理,不存在就通过get :area52`加载创建。
我最初写了如下条件判断,但.areaXX部分还没实现参数化:
// 全新KDB实例中 .data.area52: $[`area52 in key `.data; .data.area52; get `:area52]
之后我找到了相关方法,现在想优化这个lambda,把开头的.data.area52参数化,因为有数百个.areaXX需要随数据变更传入KDB刷新:
{.data.area52:()!(); @[`.data; `area52;:; (get `:area52)]} [];
解决方案:通过参数化函数实现批量处理
完全可以将区域符号作为参数传入函数,实现批量处理,无需硬编码具体区域名。
方案1:判断存在性后加载(推荐)
定义一个函数,传入区域符号,仅当.data下无该变量时加载文件:
loadArea:{[area] if[not area in key `.data; .data[area]: get `:$,string[area] ] };
使用方式:
// 加载单个区域 loadArea `area52; // 批量加载多个区域 loadArea each `area52`area53`areaXX;
方案2:强制刷新(含清空逻辑)
如果需要保留原lambda中先清空再加载的逻辑,可改成如下函数:
refreshArea:{[area] .data[area]:()!(); @[`.data; area;:; get `:$,string[area]] };
使用方式:
// 刷新单个区域 refreshArea `area52; // 批量刷新多个区域 refreshArea each `area52`area53;
关键细节
- 用
.data[area]索引方式替代硬编码的.data.area52,实现参数化; $,string[area] 将符号转换为对应的文件路径(如area52转为:area52);- 借助
each算子可快速批量处理数百个区域符号,效率更高。
内容的提问来源于stack exchange,提问作者Jason_L
相关产品推荐
相关产品推荐

