';tickerplant kdb+中的长度错误/Q

';tickerplant kdb+中的长度错误/Q,kdb,Kdb,当我用sym.q启动tick.q,用下面提供的文件启动feed.q时: q tick.q sym -p 5010 q feed.q Github链接:, tickerplant进程会在每次更新时打印“长度”错误,这通常发生在传递的元素数量不正确时: 我怀疑当feed进程调用.u.upd时会发生这种情况 关于如何解决这个问题有什么建议吗?如果您使用的是KX的普通滴答设置,则没有理由出现该错误 另外,我认为您需要以feed.q-t200的形式启动feed,否则您将无法获得任何数据 当表架构不匹配

当我用sym.q启动tick.q,用下面提供的文件启动feed.q时:

q tick.q sym -p 5010
q feed.q
Github链接:,

tickerplant进程会在每次更新时打印
“长度”
错误,这通常发生在传递的元素数量不正确时:

我怀疑当feed进程调用.u.upd时会发生这种情况


关于如何解决这个问题有什么建议吗?

如果您使用的是KX的普通滴答设置,则没有理由出现该错误

另外,我认为您需要以
feed.q-t200
的形式启动feed,否则您将无法获得任何数据

当表架构不匹配时,通常会出现
”长度
错误。因此,如果您有
sym.q
文件(并且已正确加载),则不应出现该问题

请确认这是您的目录结构:

.
├── feed.q
├── README.md
├── tick
│   ├── r.q
│   ├── sym.q
│   └── u.q
└── tick.q

sym.q
文件包含您的表架构。如果您在feedhandler中更改了某些内容,
sym.q
中的表架构必须与该更改相匹配(即,如果您在feed中添加了一列,则还必须在表中为该列添加一个保持器)

在命令行中输入
\e1
将暂停执行并运行调试器,允许您查看失败的内容并查询变量,这将有助于查明问题的原因


有关调试的详细信息,请参见此处

在某个端口(9999)上打开新的q会话,在此处添加架构定义,并将
插入
定义为
.u.upd
或类似内容:

.u.upd:{[t;d]
 .test.t:t;
 .test.d:d;
 t upsert d
}

现在,将您的提要指向这个q会话,并流式传输一些数据;这将使您能够在出现错误的情况下分析测试变量。

Alex,我可能在尝试设置自定义feedhandler时使用了“香草”设置,因此我为错误陈述问题表示歉意。当我使用上面提供的代码再次使用原始tickerplant文件进行测试时,我不再收到“长度”错误消息,但我在tickerplant中也没有得到更新。并且目录结构与上面列出的目录结构相匹配
h:hopen`:localhost:port:user:pass
(如果没有用户,则将用户保留为空)2。定义
upd:{[t;x]show x}
3
h(`.u.sub;`;`)
并查看屏幕上是否打印了任何内容。完成后,终端输出相应的报价和交易模式:
quote+
time
sym
bid
ask
bsize
asize
mode
ex!(
timespan$();
g#
symbol$();
fl.
trade+
time
sym
price
size
stop
cond
ex!(
timespan$)
g#
symbol$)
float$..`您现在必须有一个
feed.q
进程正在运行。您可以键入
\t
并查看它返回的数字吗?如果它
0
,则键入
\t 200i
,其中数字表示将数据推送到tickerplant的频率(以毫秒为单位)。一旦这样做,您应该会看到许多表格从您身边经过gh订阅tickerplant的q进程。Mark,非常感谢您的响应。按照您的建议,调试器将打印:
q)“length[0]/home/eliquinox/dev/cookbook/start/tick/tick.q:45:.u.upd:if[not-16=键入第一个x;a:“n”$a;x:$[0>键入第一个x;a,x;(登记(计数第一个x)#a),x]];f:key-flip-value t;pub[t;$[0>首先键入x;登记f!x;翻转f!x]];如果[l;l登记(`upd;t;x);i+:1]}
PS这不是一个普通的tick.q设置。我使用的是一个自定义提要处理程序。还要注意,如果使用
insert
插入到表中,一切都会正常工作,tickerplant会在调试器中使用.z.ex更新表,它会给你失败的原语,.z.ey会给你失败的参数列表,所以你希望能看到函数的哪一部分导致您出现问题Sert希望您的数据是一个嵌套的列列表,而upsert希望它是一个嵌套的行列表。请在此处进行详细讨论。z.ex:
.z.ey:`time
sym
systemtime
side
amount
price(0D21:48:03.178885000;2018.06.14T20:48:01.975;
XBTUSD;2018.06.14T20:48:03.178.``我可以看到timespan列被附加到了表中。顺便说一下,这个表的模式是
trade:([]时间:`datetime$();符号:`symbol$();系统时间:`datetime$();侧面:`symbol$);金额:`int$;价格:`float$)
通过tick.q读取似乎如果第一行上的第一个值不是timespan类型,它将作为第一个值附加在“n”$.z.P上。这里有许多选项,您可以选择,1)编辑表架构以包含timespan类型的时间列。2)将systemtime放在第一位,但将其强制转换为timespan类型,以便不追加新的时间列3)由于您已经有一个systemtime列的时间戳,建议将您的systemtime列作为第一列,并编辑tick.q以检查时间戳(-12=类型x)作为第一列而不是timespans