如何为KDB行情处理节点设置.u.endofday触发时的数据存储路径
如何在KDB+ Tick系统中指定.u.endofday触发时的RDB存储路径
好问题!默认情况下,当RDB接收到tickerplant发送的.u.endofday消息时,确实会把数据保存到RDB进程的当前工作目录(也就是tick.q所在的../../Tick目录)。要改成保存到../../HDB,有几种实用的方法,我给你拆解一下:
方法1:自定义.u.endofday处理函数
这是最灵活的方式,你可以完全控制endofday时的保存逻辑。在你的RDB启动脚本(比如rdb.q)里,重写.u.endofday函数,指定保存路径:
// 自定义.u.endofday函数,替换默认逻辑 .u.endofday:{[t] // 先执行默认的停止订阅逻辑(避免继续接收tick数据) .u.stop[]; // 确保目标目录存在(Linux/macOS版本,Windows可以换成"mkdir ../../HDB") system "mkdir -p ../../HDB"; // 将.u.data中的所有数据表保存到../../HDB目录 // .u.data是tick框架默认存储实时数据的字典,key为表名 save `../../HDB/` sv string each key `.u.data; // 可选:如果要保存整个命名空间的所有数据,用下面这行替代上面的save // :../../HDB set .`; // 完成保存后,重启订阅(如果需要继续接收次日数据) .u.start[]; }
这样当tickerplant发送.u.endofday时,RDB就会把数据写到你指定的../../HDB路径下。
方法2:修改RDB的工作目录
如果不想改动函数逻辑,你可以直接让RDB进程的工作目录指向../../HDB,这样默认的save操作就会自动保存到该目录:
方式A:启动时指定工作目录
用-d参数启动RDB:
q rdb.q -d ../../HDB
方式B:在RDB脚本开头设置工作目录
在rdb.q的最顶部添加:
// 切换工作目录到../../HDB \cd ../../HDB
这种方法简单直接,但要注意:如果你的RDB脚本里还有其他依赖原工作目录的操作(比如读取本地配置文件),需要同步调整这些路径。
方法3:修改官方tick.q框架的默认配置
如果你用的是KDB+官方提供的tick.q框架,可以直接找到框架中处理endofday的代码段,修改保存路径。通常tick.q里的.u.endofday默认会调用save到当前目录,你只需要把路径替换成../../HDB即可。
注意事项
- 一定要确保
../../HDB目录存在,并且RDB进程有该目录的读写权限,否则保存会失败。 - 测试时可以手动调用
.u.endofday[]触发保存,验证路径是否正确,不用等到每日的endofday时间点。 - 如果是多节点的分布式系统,要确认所有RDB实例都配置了正确的路径,避免数据分散存储。
内容的提问来源于stack exchange,提问作者jamesmcauley
相关产品推荐
相关产品推荐

