time-series - 如何在 kdb+/q 中为每个新行触发更新?
问题描述
我正在尝试创建一个服务,当第二次通过时,即形成新行时,来自多个传感器的不规则间隔事件被聚合到 1 秒时间桶/采样率中(看起来好像不这样做会在计算上很昂贵/内存密集)我想根据 kdb+ tick 架构触发/触发事件/发布订阅者收到的最后一行。
根据我对流处理的理解,应该在运行聚合之前缓冲事件,我的问题是应该如何在 kdb+/q 中实现这一点,从而在完成特定时间间隔(在本例中为 1 秒)之后,可以执行聚合在最新的缓冲数据上,其结果被附加到表中/发送给包含不规则传感器数据的规则间隔聚合的订阅者,在此过程中清除缓冲区。
所以简单来说:
1)如何实现收集不规则间隔事件的缓冲功能,同时保持内存限制?
2)如何以一定间隔准确聚合不规则间隔的事件,形成缓冲事件的规则间隔聚合并将该聚合发送给订阅者?
(我对此处功能的解释可能完全错误,如果有更好的方法来实现这一点,那就太好了!)
您对此事的建议将不胜感激。
谢谢。
解决方案
Terry 在他的评论中是正确的,TP 将在启动进程时在计时器指定的时间段内进行批处理。例如,以 1 秒批处理运行 vanilla TP 将如下所示。
q tick.q sym . -p 5010 -t 1000
我强烈建议不要在 TP 中进行任何处理,它应该充当入口点和恢复日志的创建者。是否以批处理模式或零延迟(不提供-t
参数)运行 TP 取决于您收到的更新的性质,关于tickerplant 吞吐量优化的白皮书是您在这里获得建议的最佳选择。
您可以在其中执行进一步的聚合或计算的链接的tickerplants,但我个人会选择让实时引擎(RTE)按如下方式运行
- RTE 是要聚合的表的 TP 的订阅者(例如,
trades
) - 聚合可以使用
.z.ts
表的时间数据执行或触发,前者更容易实现。这些聚合是聚合表的一部分,与原始数据表不同,例如tradesAgg
- 汇总的最后阶段将涉及发布回 TP。这可确保您的 TP 日志文件包含系统输入或生成的所有数据的历史记录。
- 您的 RDB 将订阅此聚合表,并通过 RDB,数据将进入您的历史数据库
推荐阅读
- python - 在 python 中只运行一个 for 循环
- java - 来自 MainActivity 的片段中的 bundle 给出的 null
- bulma - 布尔玛级别的课程不会向右
- regex - 如何编写正则表达式以从特定单词中提取前几个字符而不带或不带结束分隔符?
- sql - 为匹配条件的表中的每个值插入
- elixir - 带有 do-block 的关键字参数
- omnet++ - OMNET++:如何在 INET 4.0 的离散 NxN 空间中移动节点?
- php - 在 codeigniter 中逃避了足够的 sql 注入保护
- r - 生成矩阵,其中每个新列是前一列的倍数
- c++ - 一对 C++ 交换方法的优点是什么?