kdb+ splayed表执行get操作后meta功能失效问题咨询
问题成因
- 该错误是kdb进程访问关联枚举映射的splayed表时,内存缺失全局
sym变量导致的。 - 调用
.Q.en[hdb根路径;]处理表时,无论当前表是否包含符号类型字段,处理后的表存储为splayed结构后都会隐含对根路径下sym文件的依赖。 - 首次存储后访问正常,是因为执行.Q.en操作时,当前进程已经自动在内存中初始化了
sym变量,同时会在根目录生成sym文件(如不存在),内存存在sym时访问表不会报错。 - 进程重启后内存中的
sym变量被清空,你在直接get指定splayed表路径前没有预先加载根目录下的sym文件,解析表元数据时找不到对应的枚举映射,就会抛出..sym错误。如果是通过\l hdb根路径的方式加载整库,kdb会自动加载sym文件,不会触发该报错。
解决方案
- 每次重启进程后访问该hdb路径下的表前,先执行
sym get:/home/user/hdbroot/sym`加载全局枚举映射即可解决报错。 - 如果你确认当前及短期内不会给该表新增符号类字段,存储时可以去掉.Q.en调用,直接存储原生splayed表,即可消除对sym文件的依赖,后续需要枚举符号字段时再调整存储逻辑即可。
- 后续执行upsert增量更新时,如果你仍保留.Q.en处理逻辑,就需要始终遵守先加载sym再访问表的操作顺序。
内容的提问来源于stack exchange,提问作者user10165841
相关产品推荐
相关产品推荐

