KDB通过IPC调用加载大行情表触发limit错误的解决咨询
KDB 3.3 IPC查询超2GB限制优化方案
该错误的核心原因是KDB 3.x版本存在IPC单次传输的硬上限:单次返回的序列化字节列表长度不能超过2GB,对应列表元素数不能超过20亿,无法通过参数配置直接突破,可通过以下方案解决:
方案1:按维度拆分单次查询
不要一次性拉取全量单日数据,可按股票代码、时间切片等维度拆分多次请求,最后在本地合并结果。按股票代码拆分的示例代码如下:
// 先拉取当日所有标的列表 symList:h"exec distinct sym from qtTbl where date=2021.09.22" // 按每100个标的为一组分批拉取,合并结果 qtdata:raze {h"select from qtTbl where date=2021.09.22, sym in x"} each 100 cut symList
如果是按时间切片,可按分钟、小时等粒度拆分where条件即可。
方案2:服务端预处理减少传输量
如果不是必须拉取全量原始明细,优先在服务端完成过滤、聚合逻辑,只传输必要的结果数据:
- 仅查询需要的字段,避免传输无效字段:
qtdata:h"select close,volume,amount from qtTbl where date=2021.09.22" - 先在服务端压缩数据再传输,本地接收后解压,压缩能降低3~10倍的数据体积:
// 服务端返回压缩后的字节流 compressedData:h"-19! select from qtTbl where date=2021.09.22" // 本地解压得到原始表 qtdata:-21! compressedData
方案3:版本升级
如果有条件升级KDB版本,升级到4.0及以上版本即可,4.0版本已经取消了2GB的IPC单次传输上限,支持更大体积的数据直接传输。
方案4:文件中转
如果单日数据量远超2GB,拆分查询效率较低,可先在服务端将查询结果落地为序列化文件,通过文件传输工具同步到本地后再加载:
// 服务端落地序列化文件 h"`:/server/path/20210922_qtTbl set select from qtTbl where date=2021.09.22" // 将文件同步到本地后加载 qtdata:get `:/local/path/20210922_qtTbl
内容的提问来源于stack exchange,提问作者pmade1
相关产品推荐
相关产品推荐

