即使尝试使用从TPlog文件中获取消息计数,我也会收到wsfull错误
-11!(-2;`:/uts/tplog_2020.07.07) /- wsfull
在这种情况下,我们如何获得tplog文件的计数
在这种情况下,将消息块追加到分区是否只是显示tplog文件的选项?
编辑:
Kdb Version - 3.2
Log File size - 24G
Memory Stats -
q).Q.w[]
used| 35590543840
heap| 35500589056
peak| 35500589056
wmax| 0
mmap| 0
mphy| 270267080704
syms| 2807
symw| 158810
我试过跑步:
upd:insert(Version 3.2)
-11!(1000000;`:/uts/tplog_2020.07.07); /- output 1000000
count trade /- output count from table - 88471241
-11!(2000000;`:/uts/tplog_2020.07.07); /- output 2000000
count trade/- output count from table - 88471241
-11!(3000000;`:/uts/tplog_2020.07.07); /- wsfull
Tried with version 4.0
-11!(-2;`:/uts/tplog_2020.07.07); /- type error
当我试图从表中获取最后几条消息时,它会抛出"分段故障">
-11!(1000000;`:/uts/tplog_2020.07.07); /- output - 88471241
-5#trade /- Segmentation Fault, session closed
我的第一个猜测是tplog文件已损坏。如果有人能告诉我如何从导致类型错误的tplog文件中获得错误消息,那将是非常有帮助的?
根据评论中的讨论,我开始认为在日志文件中写入块的方式有些不对劲。重放100个块应该返回100个,重放200个块应该返回200个块(假设是格式良好的日志文件(。这里有一个可以用来检查单个块的函数:
{`counter set 0;.z.ps:{$[counter=desiredChunk;`savedChunk set x;counter+:1]};-11!(1+desiredChunk::y;x);.z.ps:{value x}}[`:tplog2020.07.01;5]
传递日志文件和要提取的区块(第一个区块从0开始(。一旦你运行了这个,你就会有一个全局变量";savedChunk";其中包含您的区块,您可以对其进行检查。单个区块应该看起来像:
q)savedChunk
`upd
`myTable
(0D05:34:00.186409000;`foo;1.23;1234;1b;.....)
/or if you write to the tplog in batches it could look like:
q)savedChunk
`upd
`myTable
(0D05:34:00.186409000 0D05:34:00.186409000;`foo`bar;1.23 4.56;1234 5678;10b;.....)
我会看看你的区块,从区块0开始,看看它们是否形成良好。然后查看块12683,看看是否有什么不正确的地方。
您的区块是否可能包含多个upd/表?(这将是我以前从未见过的自定义实现(。
您使用的KDB版本是什么?
在4.0中,他们为此添加了完整性检查。
"进一步的完整性检查已经添加到流执行-11!x,以避免对损坏/不完整的日志文件执行wsfull或segfault操作">
https://code.kx.com/q/releases/ChangesIn4.0/#miscellaneous