首页 > 解决方案 > 如何在 kdb+/q 中为每个新行触发更新?

问题描述

我正在尝试创建一个服务,当第二次通过时,即形成新行时,来自多个传感器的不规则间隔事件被聚合到 1 秒时间桶/采样率中(看起来好像不这样做会在计算上很昂贵/内存密集)我想根据 kdb+ tick 架构触发/触发事件/发布订阅者收到的最后一行。 KDB+ 滴答架构

根据我对流处理的理解,应该在运行聚合之前缓冲事件,我的问题是应该如何在 kdb+/q 中实现这一点,从而在完成特定时间间隔(在本例中为 1 秒)之后,可以执行聚合在最新的缓冲数据上,其结果被附加到表中/发送给包含不规则传感器数据的规则间隔聚合的订阅者,在此过程中清除缓冲区。

所以简单来说:

1)如何实现收集不规则间隔事件的缓冲功能,同时保持内存限制?

2)如何以一定间隔准确聚合不规则间隔的事件,形成缓冲事件的规则间隔聚合并将该聚合发送给订阅者?

(我对此处功能的解释可能完全错误,如果有更好的方法来实现这一点,那就太好了!)

您对此事的建议将不胜感激。

谢谢。

标签: time-serieskdbdataflow

解决方案


Terry 在他的评论中是正确的,TP 将在启动进程时在计时器指定的时间段内进行批处理。例如,以 1 秒批处理运行 vanilla TP 将如下所示。

q tick.q sym  .  -p 5010 -t 1000

我强烈建议不要在 TP 中进行任何处理,它应该充当入口点和恢复日志的创建者。是否以批处理模式或零延迟(不提供-t参数)运行 TP 取决于您收到的更新的性质,关于tickerplant 吞吐量优化的白皮书是您在这里获得建议的最佳选择。

您可以在其中执行进一步的聚合或计算的链接的tickerplants,但我个人会选择让实时引擎(RTE)按如下方式运行

  1. RTE 是要聚合的表的 TP 的订阅者(例如,trades
  2. 聚合可以使用.z.ts表的时间数据执行或触发,前者更容易实现。这些聚合是聚合表的一部分,与原始数据表不同,例如tradesAgg
  3. 汇总的最后阶段将涉及发布回 TP。这可确保您的 TP 日志文件包含系统输入或生成的所有数据的历史记录。
  4. 您的 RDB 将订阅此聚合表,并通过 RDB,数据将进入您的历史数据库

推荐阅读