kdb+/q TickerPlant配置:批量CSV数据发送至TP故障排查
批量发送CSV数据到KDB+ Tickerplant的解决方案
问题概述
使用官方tick.q搭建tickerplant(TP)后,通过feed.q加载CSV数据并尝试发送至TP,但数据未正确送达。需求是批量发送已加载的表数据(而非实时流式逐行发送)。
原feed.q存在的问题
原脚本使用.z.ts定时逐行发送数据,属于流式传输,且存在以下潜在问题:
- 全局变量
i的作用域可能导致逻辑异常 - 逐行发送效率低,且未处理连接失败或发送确认
- 未确保发送的表结构与TP端一致
修正后的feed.q脚本
// 连接Tickerplant端口 h:hopen`::5010 // 检查连接是否成功 if[h=-1; show "Failed to connect to tickerplant"; exit] // 加载CSV数据(保留原有加载逻辑,确保最终rpr为正确的表格式) fPath:{.Q.dd [`:/Users/dt/hb/rpcoreData/histData/csvs]x}'[key `:/Users/dt/hb/rpcoreData/histData/csvs] fPath1:{.Q.dd[x] each key x}'[fPath] rpr:raze {("**************************";enlist",") 0: read0 each x}'[raze fPath1] // 确保rpr转换为表结构(根据实际解析结果调整,示例为行列表转表) // 如果解析后是列的列表,使用 `rpr:flip rpr` rpr:flip enlist rpr // 方案1:批量发送整个表到TP neg h(`.u.upd;`rpr;rpr) // 方案2:大表分块发送(避免内存压力,示例每次发10000行) // chunkSize:10000 // for[i:0; i<count rpr; i+:chunkSize] { // neg h(`.u.upd;`rpr;rpr[i+i til chunkSize]) // } // 发送完成后关闭连接 hclose h
关键配置步骤
初始化TP的表结构
TP需要提前知道接收的表结构,需在schema文件(如schema.q)中定义rpr表,示例:// schema.q rpr:([]time:`timespan$(); sym:`symbol$(); price:`float$(); size:`long$())启动TP时加载schema:
q tick.q -p 5010 schema.q确保表结构一致性
feed端加载的rpr表字段顺序、类型必须与TP端定义完全一致,否则TP会拒绝接收数据。连接有效性检查
增加连接失败的判断逻辑,避免在未连接成功的情况下执行发送操作。
验证数据是否送达
在TP实例中执行rpr即可查看已接收的数据;若使用了downstream subscriber(如rdb),可在rdb中查询对应表。
内容的提问来源于stack exchange,提问作者bashprofile84
相关产品推荐
相关产品推荐

