关于时序引擎的运行机制问题

下面例子是 https://www.dolphindb.cn/cn/help/FunctionsandCommands/FunctionReferences/c/createTimeSeriesEngine.html 文档中第一个例子
$ share streamTable(1000:0, `time`sym`volume, [TIMESTAMP, SYMBOL, INT]) as trades
$ output1 = table(10000:0, `time`sym`sumVolume, [TIMESTAMP, SYMBOL, INT])
$ engine1 = createTimeSeriesEngine(name="engine1", windowSize=60000, step=60000, metrics=<[sum(volume)]>, dummyTable=trades, outputTable=output1, timeColumn=`time, useSystemTime=false, keyColumn=`sym, garbageSize=50, useWindowStartTime=false)
$ subscribeTable(tableName="trades", actionName="engine1", offset=0, handler=append!{engine1}, msgAsTable=true);

$ insert into trades values(2018.10.08T01:01:01.785,`A,10)
$ insert into trades values(2018.10.08T01:01:02.125,`B,26)
$ insert into trades values(2018.10.08T01:01:10.263,`B,14)
$ insert into trades values(2018.10.08T01:01:12.457,`A,28)
$ insert into trades values(2018.10.08T01:02:10.789,`A,15)
$ insert into trades values(2018.10.08T01:02:12.005,`B,9)
$ insert into trades values(2018.10.08T01:02:30.021,`A,10)
$ insert into trades values(2018.10.08T01:04:02.236,`A,29)
$ insert into trades values(2018.10.08T01:04:04.412,`B,32)
$ insert into trades values(2018.10.08T01:04:05.152,`B,23)

$ sleep(10)

$ select * from output1;
(1) 把metrics改写为metrics=<f1(volume)>,同时定义
defg f1(volume){
    return sum(volume)
}
代码正常运行,且和例子结果一致

(2)自定义函数改成
defg f1(volume){
    print(123)
    return sum(volume)
}
结果中的sumVolume列全是空的,控制台只打印出一次123
问题:我理解每个窗口进来时序引擎都要触发print(123),为什么只打印了一次? 另外print语句不影响执行逻辑,只是debug用,为什么sumVolume列显示不出来了?

(3)自定义函数改成
defg f1(volume){
    print(size(volume))
    return sum(volume)
}
控制台输出0,为什么size(volume)会是0? 
补充:在1.30.18和2.00.6版本中输出为8, 在2.00.5版本输出为0? 这是BUG导致的还是什么?

(4)自定义函数改成
defg f1(volume){
    if (size(volume)==0){
        return 999
    }
    return sum(volume)
}

发现结果表sumVolume列为38 40 25 9, 为什么没有出现我想输出的999情况? 但函数内,我明明定义如果size(volume)==0时 输出聚合值为999. 而在第三步 证明了size(volume)是会等于0的。

(5) 一开始进来的size(volume)=0的窗口到底是什么? 为什么会有空窗口进入? 我在自己另外的脚本中是用时序引擎,由于这个空窗口的进入,让我自定义函数内 很多因子计算的语句都会报错, 如何避免这种情况。 (我的数据是0.5秒一条的,windowsize=100秒,step=1秒,理论上不应该进来长度为0的窗口)


后面貌似没问题了 用了最新版解决。但对于第二步还是有疑问
请先 登录 后评论

1 个回答

mhxiang

目前我这边测试没有你说的size(volume)为0的输出,目前已经发布最新版本,可以使用最新版

请先 登录 后评论
  • 1 关注
  • 0 收藏,793 浏览
  • ddbuserex 提出于 2022-07-13 10:13

相似问题