炒股问题_股票知识问答_股票黑马推荐_问股网_在线诊股 设为首页 - 加入收藏 - 网站地图

td指标使用技巧(td指标源码)

发布时间:2023-04-13 19:23

来源:重症医学

 

综述目的:

经肺热稀释(TPTD)装置不仅能够很好地测量心输出量,还可通过一些其他血流动力学变量来估测心脏前负荷和收缩功能、肺水肿及肺通透性。根据最近的文献,我们描述了如何测量不同的参数,强调了目前的临床关注热点,并列出了该技术的潜在应用限制和副作用。

最新进展:

用TPTD测量心输出量的方法现在已经得到广泛应用,至少与肺动脉导管相比是如此。校准的脉搏轮廓分析,所产生的TPTD参数,准确性明显地优于在非校准设备上。TPTD的最大优点是测量血管外肺水和肺通透性,这有助于诊断急性呼吸窘迫综合征和管理各种危重疾病的液体治疗。它还可以快速明确左心室收缩功能衰竭。它提供的信息被认为是超声心动图的补充。

总结:

TPTD提供的几个指标,可以在血流动力学不稳定患者的治疗管理过程中帮助做出决定。它被运用于需要精准管理和整体把握心肺功能情况的危重病人救治上。

 

关键点:

@TPTD不仅可以有创地测量心输出量,还可以测量几个胸腔内容积。

@TPTD的主要优点是测量血管外肺水和肺通透性,这可以指导各种类型的重症监护患者的液体治疗。

@TPTD设备的另一个优点是提供校准的脉搏轮廓分析,该分析提供心输出量的精确、连续和实时估计。从而可以让临床医师更容易进行液体反应测试。

@与肺动脉导管一样,TPTD装置推荐用于对初始治疗无反应的急性循环衰竭患者。结合超声心动图,可以进行全面的血流动力学评估。

 

简介:

在过去的几年中,已经出现了一些血液动力学监测技术作为肺动脉导管(PAC)的替代方法。经肺热稀释(TPTD)和脉搏轮廓分析是当今危重病人中最常使用的分析方法。这两种可用的设备(PiCCO,Pulsion Medical Systems,Feldkirchen,Germany and VolumeView,Edwards LifeSciences,Irvine,CA)不仅可以测量心输出量,还可以测量心脏前负荷、心脏系统功能的其他几个指标、肺水肿和肺通透性。

TPTD如何测量这些参数?这些测量是否经过验证?他们应该如何在床边使用?TPTD有哪些适应症和禁忌症?根据最近的文献进行本次综述以期回答以上的问题。

 

心输出的测量

测量原理:

TPTD需要通常放置在上腔静脉区域的标准中心静脉导管,和特定的尖端带有热敏电阻,通常通过股动脉插入的动脉导管。在通过静脉导管注射冷的等渗盐水后,热敏电阻检测血液温度的降低。使用改进的Stewart-Hamilton算法分析热稀释曲线可以计算出心输出量。TPTD最近被证实可用于测量心输出量的PAC的有效替代方案。

可通过特定接口的导管弹丸式注射冷水。静脉导管可以插入股静脉,而不改变心输出量的测量。已经表明,可以使用弹丸式注射室温下的盐水,而不改变测量精确度。可以使用特定的导管将尖端带有热敏电阻的导管插入腋动脉、肱动脉或桡动脉。

缺点:

在静脉-静脉血液滤过期间,心输出量测量仍然准确,最近已经证明,在TPTD测量期间没有必要停止肾脏替代治疗。然而,TPTD在体外膜氧合过程中可能不可靠。最近证明,在心房颤动的情况下,以及在有瓣膜病或心肌病的情况下,测量仍然有效。在大量血管外肺水(EVLW)的情况下,可能会显著导致温度的丢失,从而心输出量的测量不太可靠,虽然它很可能是可以忽略不计的。最后,TPTD的主要缺点是它只提供心输出量的间歇测量。因此,它不能用于评估液体反应性测试期间心输出量的短期变化。

校准的脉搏轮廓分析

除TPTD外,PiCCO和VolumeView设备还允许通过动脉导管测量的动脉血压曲线的脉搏轮廓分析实时监测心输出量。脉搏轮廓分析基于以下原则:动脉曲线收缩部的振幅以及几何特征与每搏输出量相关。其优点在于它提供了心输出量的实时估计,但缺点是该估计值随时间逐渐偏离真实值。

使用TPTD设备,脉搏轮廓分析可以得到校准。在每次弹丸式推注时,通过热稀释技术提供的心输出量值用于重新校准脉搏轮廓分析。这些校准设备比没有校准的脉搏轮廓分析技术更可靠。脉搏轮廓分析不仅可以实时测量心输出量,而且非常精确。因此,适合应用于被动抬腿试验、呼气末阻塞测试或肺复张来预测前负荷反应性。

 

心脏前负荷的评估:全心舒张末期容积

 

测量原理:

除心输出量外,TPTD还估计了几个胸腔内容积(图1)。以体表面积索引的全心舒张末期容积(GEDV)是舒张末期四个心腔的容积。使用PiCCO装置,其估算值是同时基于热稀释曲线及其对数变换的分析(图2)。VolumeView的工作方式则不同,因为它通过分析热稀释曲线上下部分的斜率来评估GEDV。尽管如此,这两种技术都被证明是可以互换的。

缺点:

GEDV包括四个心腔的体积,因此在右心室扩张的情况下它会高估左心室前负荷(图2)。与心脏前负荷的任何其他静态指标一样,GEDV无法预测到前负荷反应性。有学者怀疑GEDV和心输出量之间存在数学耦联,因为这两个变量都来自相同的热稀释曲线,但最近尚未得到证实。

经股静脉通路的经肺热稀释

当通过股静脉导管注射冷水时,GEDV的正常值会更高,因为它包含了下腔静脉的体积。在这种情况下应用GEDV的校正。

 

 

左心室收缩功能的评估:心功能指数和全心射血分数

 

测量原理:

心功能指数(CFI)是由PiCCO和VolumeView设备计算出的,等于心指数除以GEDV的比值(图1)。全心射血分数(GEF)是每搏输出量与的四分之一GEDV的比值,以百分比表示,它比CFI更接近于左心室射血分数。

有研究表明,通过CFI估计左心室射血分数已达到可接受的可靠标准。特别是,低CFI可以准确地检测到其低值,并跟踪其变化。

缺点:

由于GEDV反映了四个心腔的体积,CFI和GEF低估了右心室扩张情况下左心室收缩功能(比值的分母增加)。在股静脉通路的情况下,GEDV被校正用于计算GEF和CFI,尽管目前对后者存在怀疑。

临床应用:

毫无疑问,超声心动图是评估血流动力学不稳定患者心功能的参考。然而,它的缺点是繁琐且耗时,这就阻碍了其在床边进行频繁重复测定。对TPTD的兴趣可能是因为它较容易对全心功能受损的情况发出提示。这应该通过超声心动图确认,超声心动图将区分右心室功能障碍和左心室功能障碍,分析心脏结构并找出心脏功能障碍的解释。

 

血管外肺水和肺血管通透性指数

 

测量原理:

EVLW反映了肺间质和肺泡中含有的液体的量。应用PiCCO装置进行测定是通过从胸腔内热容积减去胸内血容量(即GEDV乘以1.25)获得的(图1)。它是由预测的体重代入计算得到。使用VolumeView估算EVLW则是完全不同的,因为它对GEDV的估算不同(见上文)。

肺血管通透性指数(PVPI)是由血管外肺水(EVLW)与肺血容量的比值,即相当于渗漏到血管外的液体体积与肺血管中剩余的液体体积之间的比率。

与重量测定法对比,EVLW已得到验证,重量测定法被认为是人类的金标准。EVLW可以测量各种临床环境中肺水的微小和短期变化。与静水压型肺水肿相比,PVPI在急性呼吸窘迫综合征(ARDS)中的表现更高,并准确检测到肺通透性的增加。

缺点:

在肺栓塞的情况下,由于妨碍了冷示剂抵达由该闭塞动脉血供的肺组织,TPTD会低估EVLW的量。然而,这只发生在相对较大的血管闭塞的情况下。在肺切除的情况下,肺水的量逻辑上是降低的。在一些特殊类型的ARDS的情况下,肺血流可能会重新分布在远离水肿部位的其他地方,从而导致EVLW被低估。大量胸腔积液可能导致TPTD过高估计EVLW。肾脏替代治疗不会改变EVLW测量的可靠性,这有可能是因为体外回路中的血流量不足缘故。

临床应用:

ARDS的定义:

虽然肺水的增加和肺通透性的损害是ARDS的标志,但通过TPTD进行的估测并未包含在柏林的定义中。柏林定义有许多缺点。首先,它需要准确解释胸部X射线,这在实践中是困难的。其次,是通过对动脉氧分压与吸入氧浓度的比值来评估ARDS的严重程度,虽然它高度依赖于后者——起决定因素的吸入氧浓度,以及呼气末正压水平。第三,根据柏林的定义,肺水肿的渗透性增加是基于左心室的充盈压不应该升高的事实,这显然是粗糙和间接的。第四,ARDS的病理结果与柏林诊断标准之间存在一定的一致性,然而弥漫性肺泡损伤可以通过EVLW准确检测到。所有这些观点都支持将EVLW纳入ARDS的定义。

液体管理:

减少累积的体液正平衡应该是重症患者管理的目标,因为积极的体液正平衡是与死亡率相关的独立因素。为此,在初始阶段,只有当可以可靠地推测它是有效的时,才应该给予液体,这意味着应该提早预测液体的反应性。此外,如果输注液体风险过高,应该避免使用液体,EVLW和PVPI可能有助于评估这种风险。

机械通气的撤机

呼吸试验期间EVLW的增加能准确地检测到短期撤机引起的肺水肿。TPTD设备的设置不应仅仅是为了进行这种诊断,因为对即将拔管的患者的进行侵入性操作是不合理的。然而,如果患者仍然配备这样的装置,那么不应忽略那些未通过撤机试验的患者的EVLW的增加。

其他用途:

最近的发表的一些文献还强调了EVLW和PVPI的监测可能有助于其它的临床情况。如用于烧伤患者,以评估体液过度输注风险;用于肺移植患者,检测早期移植物功能障碍,以及肺动脉内膜切除术后患者用于检测肺水肿。

 

经肺热稀释法的指标

在重症监护环境中,目前的共识推荐,应对那些对初始复苏没有反应的患者监测心输出量,并且PAC或TPTD装置应该用于此目的。

首先,这是合理的,因为一般来说通过临床检查的进行心输出量的估测,尤其是动脉压的估计,都是相当粗略的。其次,只有复杂的设备才能回答复杂及危重的患者在复苏过程中出现的所有问题。

使用TPTD设备进行监测从未被证明可以改善这些患者的预后。所以需要在TPTD设备的使用上附加治疗学计算程序。反之,不会观察到任何改善,正如PAC的情况一样。然而,考虑到患者的复杂性以及这些先进监测设备可以提供的变量数量,构建这样的计算程序将非常困难。最后,我们的观点是,人们不需要这样的研究结果应用于这些床边使用的设备。我们是否需要进行研究,证明超声心动图为休克患者提供了出色的信息,从而改善了患者的预后?

PAC和TPTD设备之间的选择应该主要由团队经验驱动,尽管两者都以完全不同的方式回答了在休克患者中提出的问题。这两种技术都提供了心输出量的可靠测量,但TPTD设备的校准脉搏轮廓分析更有利于进行液体反应性测试。心输出量是否足以满足氧需求,可通过PAC的混合静脉血氧饱和度来评估。而对于TPTD装置,仅能获得中心静脉血氧饱和度。PVPI和EVLW比使用PAC更能直接评估液体输注的肺脏风险,因为在使用PAC时不同的肺动脉阻断压力可能对应不同的风险,这取决于肺毛细血管通透性。使用PAC时,心脏收缩功能的损害通过肺动脉阻断压力的增加和心输出量的减少来估计,而通过TPTD设备可以获得更多的直接指标,例如CFI和GEF。PAC相对于TPTD的明显优势是估计肺动脉压力和阻力。根据国际推荐意见,在患有右心室功能障碍的循环衰竭的情况下更倾向于选择PAC。

两种类型的设备的并发症发生率相似。对于TPTD,主要风险在于动脉损伤,特别是在使用股动脉时,因为动脉导管的直径大于标准导管,并且在插入前需要动脉扩张。当然在血管假体的情况下是相反的。对于患有严重动脉病的患者,应谨慎评估风险/收益比。

超声心动图可以对心脏功能和结构进行出色的评估,但不能实现简单实时的监测。在这方面,它应在间歇评估期间与TPTD结合使用。单独使用TPTD,反对超声心动图可能是没有意义的。

 

结论

TPTD设备提供完整的血液动力学评估。它们的主要优势在于通过校准的脉搏轮廓分析实时测定心输出量,以及血管外肺水及肺血管通透性的测定。后者对于在血液动力学不稳定的患者中指导液体治疗特别有用。由于其成本和侵入性,TPTD设备适用于急性循环衰竭的患者,这些患者对初始治疗无反应,和/或存在相关的ARDS,其中液体管理可能特别棘手。在那些临床情况下,TPTD与超声心动图的结合可以进行全面的血液动力学评估。

小 T 导读:兴盛优选需要通过实时产生的数据来判断设备是否工作、检测通讯是否延时、观测 SNMP OID 流量是否正常等,从而保障运维与网络人员及时发现问题并修复。为高效处理各类时序数据,保障服务的稳定运行,在对比了 Elasticsearch、InfluxDB 和 TDengine 三款产品之后,他们选择并落地了 TDengine。

企业介绍

湖南兴盛优选电子商务有限公司(简称兴盛优选),总部位于湖南长沙,是一家关注民生的互联网“新零售”平台,主要定位是解决家庭消费者的日常需求,提供包括蔬菜水果、肉禽水产、米面粮油、日用百货等全品类精选商品。兴盛优选依托社区实体便利店,通过“预售+自提”的模式为用户提供服务,是社区电商中唯一一家估值超过 150 亿美金的“独角兽”。

业务背景

为了保证互联网服务的高效和稳定,我们需要监控公司所有的节点服务器(包括云服务器)、交换机及路由器。我们需要通过实时产生的数据来判断设备是否工作、检测通讯是否延时、观测 SNMP OID 流量是否正常等,从而保障运维与网络人员及时发现问题并修复。

这类数据是非常典型的时序数据,应该如何高效地处理呢?现在市面上有几款非常流行的时序数据库(Time Series Database)产品。应该如何评估并选择适合我们业务场景的技术平台呢?

产品调研

针对该业务场景,我们调研了如下几个产品:Elasticsearch、InfluxDB 和 TDengine。具体对比如下。

Elasticsearch

  • 优点:可以分布式部署,可以无障碍插入,支持任意的字段类型,查询速度快。
  • 缺点:只适合记录日志且并发数据量不大的情况,对于海量设备的时序数据写入有性能问题。

InfluxDB

  • 优点:支持无模式(Schemaless 写入),限制较少。
  • 缺点:当面对大批量的数据同时插入或读取时,内存容易被占满,导致死机。尤其是其中的轮询机制,在检验过期数据时,内存占用特别大。此外,在读取数据时,读出来的是列表,可读性差,解析比较麻烦。

TDengine

  • 优点:列式存储以及“一个设备一张表”的模型与我们业务场景十分契合。此外,还可以兼容我们以前使用 InfluxDB 时所习惯的插入方式,代码可读性强,支持强绑定参数。在执行海量数据的查询时,响应速度比 InfluxDB 更快。
  • 缺点:Schemeless 的支持还在持续完善之中。

由于该项目未来需要监控我们公司的所有服务器,平均每台对应的 OID 会有几百个,如果每 1-5 秒采集存储一次,并发数据量会非常大。因此,我们从候选中淘汰了 Elasticsearch。

接下来我们又继续对比了 InfluxDB 和 TDengine。InfluxDB 单节点性能不足,集群闭源且性能未知。反观 TDengine,其集群功能是开源的,且保留了企业版的部分核心功能。这让我们可以直接非常深入地了解 TDengine 的优劣。从这方面考虑,我们选择了 TDengine。而且在实际使用中,我们又发现了 TDengine 的一大优势,其“一个设备一张表”的模型十分契合我们的实际场景。

系统架构

在引入 TDengine 之后,我们的系统架构如下图所示。

在该架构下,前端制定好规则下发(例如:流量阈值,延时阈值),后端看是否需要存储规则,或检查规则是否发生变化,然后把规则下发给 ETCD 来做定时任务调度。我们共有三个程序任务,通过 ETCD 管理,定时和各类设备通信,根据不同规则分别抓取各自需要的数据:

  • SNMP 引擎通过 OID 监控网络设备各项指标
  • TCPing 引擎用于监控服务器 TCP 端口状态
  • ICMP 引擎重点采集接收或返回数据的时间

这三大类数据采集之后,会经过统一处理,再写入 TDengine。

我们使用 5 个节点搭建了一套 TDengine 集群:

我们选择了无模式写入,在写入时自动建表,具体写入方式可参考官网。这样一来,每一台服务器对应的类型都是一张超级表,我们选择尽量地分表 ,提升查询速度。

对于 SNMP 类型的超级表来说,每一个子表就是一个 OID。

对于 TCPing 类型,我们按照 TCP 端口来区分子表。

对于 ICMP 类型的超级表,我们以 task_id 和 task_type 作为区分子表的依据:

目前我们已经存储了 500 万张子表,平均算下来设备上报频率大概为 3 秒 1 行,总数据量达到了百亿级别,而占用的存储空间只有 70GB 左右。这应该得益于 TDengine 针对性地使用了列式压缩,存储资源占用很小,压缩率大概为 8% 左右。TDengine 可以很好地顶住写入和存储压力。而查询方面,我们会批量查询部分表的特定时间的值,大部分数据用于实时的监控报警。

经验总结

在使用过程中,花时间相对较多的大概是无模式插入的摸索吧。

对于从 InfluxDB 切换过来的用户,初期可能会有一些不适应。因为 TDengine 最初并不是按照 Schemaless 来设计的,这个功能是后期加入的,系统最终还是会把无模式转化成 SQL 再进行写入,只是简化了用户的操作。不过 TDengine 一直在完善相关的生态适配,比如对于大小写的特殊字符的存储,完善元数据管理,收纳各种形式的数据类型,也在逐步向 InfluxDB 的自由式写入靠近。

除此之外,我们也遇到过一个问题,目前 Go 连接器的查询 API 暂时不支持将多条 SQL 拼接在一起统一执行。因此我们采取了并发读取,但性能可能会受到一点影响,期待后续的版本能够解决。

最后,TDengine 的支持团队相当负责,配合积极,让我们快速上手了这款轻便易用、性能超高的时序数据库。目前我们只接入了一部分服务器及设备,后续我们计划把公司全国范围内所有的服务器都接入进来,也会推荐公司更多部门使用。一切顺利的话,我们也会考虑包括仓库运货机器人,物流线设备等更多应用场景。


点击了解更多 TDengine Database 的具体细节。

 

两天前7月12号,我对外正式宣布TDengine, 一款专为物联网定制打造的大数据平台软件,正式开源,将我和涛思数据团队两年多的时间写下的10多万行C语言代码放在GitHuB上,分享给全球的开发者。

开源的代码里,有我自己亲手写的3万多行C代码,包括我自己一直很得意的定时器,RPC, 内存管理等一系列工具类程序。更重要的是,我们将最核心的存储引擎、计算引擎完全开源出来。存储引擎是我亲手写的,是我仔细分析物联网数据特点后写出来的,因此具有超强的数据读写性能。计算引擎是团队里的廖博士写的,创新的解决了多表聚合的性能问题。宣布开源,而且是将核心代码开源,对于我个人,对于涛思数据,都是跨出了最重大的一步。宣布前我还在忐忑不安,但宣布后,如释重负,轻松了不少,因为终于做了一件想做,但又不敢做,一直犹豫是否要做的事情。

从1984年我高一时写下第一个Basic语言程序,35年过去。这35年中,我进中国科大学流体力学、天体物理,后去美国留学,进芝加哥Motorola,3Com等公司工作,2008年回北京创业,开发了无数的产品。从编程发烧友,到专业的软件工程师、高级工程师、架构师再到CTO,CEO,一路走来,可以说是典型的IT男发展路线。2016年底,我休整一年后,看到物联网大数据的技术挑战和市场机会,虽然自己当时已经快50岁,但我实在不想游山玩水结束后半生,于是抱着“Leavea dent in the world”的想法,再次走向战场,并且冲在了最前线。一个人呆在家里,每天12个小时,连续两个月时间,写了一万八千行代码,写出了一个高效的时序数据存储引擎,证明出我设计的数据模型能把数据插入、查询速度提高十倍以上。随后获得明势资本、蛮子基金的天使投资,组建团队,2017年6月涛思数据正式成立。

在团队的努力下,2018年8月涛思数据发布了TDengine的第一个商业版。凭着产品超强的性能,简单、易用、易学的特点,在没有任何销售人员的情况下,我们获得了将近十个付费客户,涉及到智慧城市、数控机床、新能源、车联网、IT运维等行业,而且最近又在电力行业实现突破。在所有场合,当我介绍TDengine的时候,我都是特别的自豪,因为这个超强的产品是我与团队一行一行代码码出来的,是无数个日夜debug出来的,不仅远超国内的产品,更是能把全球排名第一的同类产品拉下马。但我不时陷入沉思,我50岁的年龄,每天还没日没夜写代码,debug程序,见客户的目的是什么?什么才是一个程序员最大的回报?

一段程序好比一个作品,一个作品只有有人欣赏才有价值,一段程序只有更多的人使用才有价值。这35年里我开发过很多产品,但一直让我念念不忘,总给人提及的是1991年我为中国科大LB膜实验室开发的LB膜天平,还有1993年我为姐姐开发的财务软件。因为这两个软件,在将近30年后,还有人在天天使用。中国科大LB膜实验室的老师同学,还有我姐,打开电脑,看到的还是陶建辉的名字。这真是一件让我兴奋和自豪的事情,因为他们证明了我的价值。

怎么让更多的人使用上TDengine?怎么让物联网、车联网、工业互联网等行业普遍采用的Hadoop一套大数据处理体系被尽快淘汰掉?作为一个基础软件,一个中间件产品,怎么能在全球范围推广,而不是仅在中国自吹自擂?我自然想到了开源。但开源什么,不开源什么,与很多朋友交流,举棋不定。

后来终于想明白了,要开源,就一定要开源最核心,最有价值的部分。因为最核心的部分不分享给大家,大家采用你的产品就没有任何意义,毕竟,市场上有太多的可替代的方案。只有将自己最美、最有吸引力的地方充分展示出来,才能吸引更多的人来使用。因此我最后决定将最核心的存储引擎、计算引擎、还有成套的工具完全开源。但怎么让更多人的领会到我们的架构呢?决定花大力气写文档、把我们技术实现细节写出来,而且这相当程度上能够回答众多的关于性能的质疑。开源的目的,不仅是想给中国的开发者用,还希望全球的开发者来用,因此又花时间写出整个英文文档。TDengine只是一个中间件,不是最终应用,因此团队又开始写应用案列,结合车联网、IT运维、数控机床等实际场景,将TDengine怎么使用用中文、英文写出来。

 

 

一百亿记录查询的现场演示,吸引了很多程序员

 

 

从高中起,我写程序的癖好就是用极少的代码量去追求极致的运行效率和极致的用户体验。2008年我创办和信,我自己写的WindowsMobile的和信客户端只有18K,就能通过移动互联网免费收发短信、彩信和邮件。2013年创办快乐妈咪,胎心算法程序不到600行源代码。TDengine是我这一风格的延续,没有采用任何第三方组件,1.5M的安装包就将一个物联网大数据平台搞定,从下载、安装到运行,不会超过5秒钟。要是有程序员仔细研究我们源码,看我们是怎么做到的,我会特别的开心。要是有程序员能把我这套方法借鉴过去,把他现在臃肿的系统大幅裁剪,把性能大幅提升,那我更会心花怒放。昨天有人在微信群里告诉我,说RPC模块写的高效简洁,准备采纳,真让我有点得意忘形。

写财务软件,LB膜天平程序时,是我一个人的战斗。令人开心的是,这次TDengine是一个团队在战斗。为了开源,团队备战了一个月时间。90后洪泽、江燚总担心我们的文档写的不清楚,不够仔细,让大家看不明白,因此不停的改,廖博士总想着代码要如何规范,如何让产品更稳定,性能对比测试文档的文字都一丝不苟,胜亮、李晖想着怎么让配置参数更加简单、怎么让安装过程更加顺利,连我们团队里唯一的女生虽然不写程序也激情高涨,为我们程序猿们摇旗呐喊。最开心的是,我刚刚高中毕业的儿子,主动承担了整个新版网站的开发,从设计、前端、后台、浏览器适配、数据分析到搜索引擎优化,都是他一人搞定,而且不放过任何一个细节,无论是单词、语法错误,还是排版的样式,都细细研究。有这样的团队,我心满意足。

宣布开源之前,我没有去征询投资方的意见。但我宣布之后,明势资本的明明、Neil等都第一时间转发消息,主动问我需要什么样的支持,蛮子基金、永辉瑞金和温青投资也都是第一时间支持转发。谢谢你们的信任,谢谢你们对程序员情怀的支持。有你们做后盾,我们开源的道路只会更顺。

写了35年的程序,终于把自己的看家本领晒了出来,共享出来。两年多的时间,近二十万行代码,放在了GitHub上。好多朋友关切的问我,开源怎么赢利?抛开开源的商业模式不提,我想,只要我们开源的代码真正创造了价值,有人用,那我和团队就是最大的赢家。如果30年后,还有人在用TDengine,哪怕只是其中一个模块,其中一个函数,那就是对我们两年多日夜奋战的最大肯定,就是给我这个程序员的最大回报。更希望30年后,我还能对TDengine继续贡献代码,那将是我还未老去的最好证明。

如果大家想支持我这个50岁的程序员和涛思数据团队,支持源自中国的IT底层核心技术,那就赶快到GitHub上搜索、下载TDengine源码,用起来。如果你发现什么问题,我只会高兴,不睡觉都想尽快去解决它。如果喜欢,更欢迎参与到我们这个项目中来。五年之内,世界上90%以上的数据都将是物联网采集的数据,如果我们一起开发出一个极为高效的数据处理引擎来处理这些数据,而且为全球开发者所使用,你是贡献者之一,那是一个多么自豪的事情。

钱再多,也难让人在历史上留下痕迹,但一幅好的作品却可以传承,让后人好好的品味。愿我领头开发的TDengine成为传世之作,Leave a dent in the world!

 


关于TDengine开源的所有资料,欢迎大家前往www.taosdata.com了解。也可以直接前往GitHub上下载使用,地址是:
https://github.com/taosdata/TDengine。

您的使用,就是对开源者最大的支持。

 

作者:陈玉|涛思数据

作为一款高性能的时序数据库,TDengine提供了强大的数据分析功能。在TDengine官网()的第一个章节里,有这样的描述:“无论是十年前还是一秒钟前的数据,指定时间范围即可查询。数据可在时间轴上或多个设备上进行聚合。”

今天,我们的主角就是上文中“可在时间轴上”聚合的强大函数——INTERVAL。

INTERVAL是TDengine一大重要功能,可以帮助我们实现降低数据采集频率的功能——也就是降采样

举个简单的例子:假设我们有某个设备一年的数据,时间数据的频率是1天,那么就是一共365条数据。现在,如果我们想按照‘月’这个频率统计,那么数据量就变成了12条。

根据官网的语法描述,相关的功能模块有三个:

  1. INTERVAL本身
  2. SLIDING
  3. INTERVAL OFFSET

对于以处理时序数据为根基的时序数据库来说,如何灵活的利用时间频率来计算分析数据实在是太重要了。下面我们围绕上面三个功能模块,分别举一个简单的应用场景的例子并做出具体说明:

 

1.INTERVAL:查询温度传感器t1记录的温度、压力每五分钟的平均值

select avg(t), avg(p) from t1 interval(5m);

这是一个最简单的使用情况,INTERVAL负责指定时间范围窗口,由AVG这种聚合函数来计算这个时间范围内的平均值。也可以换成MAX/MIN这类的选择函数,来统计出这个时间范围内的最大值/最小值。(在TAOS SQL中,聚合函数指的是COUNT/AVG/TWA/SUM等用于从数据集中汇合再计算的函数,选择函数是指
MIN/MAX/FIRST/LAST/LAST_ROW等用于从数据集中筛选结果的函数。)

INTERVAL本质上就是group by的时间版本,所以一定需要配合上述聚合或选择函数来使用。INTERVAL后面的时间单位可以是 a(毫秒)、s(秒)、m(分)、h(小时)、d(自然日)、w(周), n(自然月) 和 y(自然年)。(暂时还不支持自然周,interval(1w) 目前等效于interval(7d))。

 

2.SLIDING:可以统计类似股票市场的均线

select avg(t) from stockmarket interval(5d) sliding(1d)。

上述语句的实际含义是统计股市上某股票所有每过一天的5天的价格平均值,把这些值连起来,就是大家熟知的五日均线了。

在上述计算过程中,SLIDING起到了非常关键的作用。我们已经知道,INTERVAL 的值负责指定每次执行查询的时间窗口。SLIDING则代表着指定窗口向前滑动的时间。如下图所示:

t0s,t1s,t2s分别是三个时间窗口的起点,t0e,t1e,t2e分别是三个时间窗口的终点。当我们在查询中不指定SLIDING的值时,它默认等于INTERVAL VALUE。也即是说在第一个例子当中的select avg(t), avg(p) from t1 interval(5m)等效于select avg(t), avg(p) from t1 interval(5m) sliding (5m);

 

3.INTERVAL OFFSET:统计某个设备在其他时区(向西相差三个时区)的一个月的总数据量

select sum(t) from t1 interval(1n,3h) ;

这个SQL的语义是:统计当前服务端所在时区向西推动三个时区后的这个设备的该月总数据。OFFSET 3h代表的是OFFSET值为3h,也就是说这个SQL适用于统计不同时区的自然月数据统计。

INTERVAL OFFSET会相对复杂一些。想了解的话,需要先更多地了解INTERVAL和时区的关系。

如果INTERVAL的值是自然日(d),自然月(n),自然年(y),那么它就是对齐TDengine服务端所在时区的0点开始做的窗口切分,如下图所示:不论当前所属哪个时区,所有时间戳列的起始时间都是0点。

但是,如果是以时分秒及以下的时间单位去切分窗口,那么INTERVAL的值则是对齐从UTC-0时间的00:00:00.000开始切分的时间窗口。

如下图所示,时间戳列的起始时间都是8点,这是因为TDengine客户端的时区为UTC-8,标准时间为0点的时候,东八区为8点(注意:在POSIX标准中,UTC-8代表东八区,与平时的习惯性表达不一样)。

这个场景,就是官网文档中这段话的含义:

TDengine 中时间戳的时区总是由客户端进行处理,与服务端无关。具体来说,客户端会对 SQL 语句中的时间戳进行时区转换,转为 UTC-0时区的Unix时间戳再交由服务端进行写入和查询;在读取数据时,服务端也是采用 UTC-0时区提供的原始数据,客户端收到后再根据本地设置,把时间戳转换为本地系统所要求的时区进行显示。

总结一下就是:TDengine以时间戳形式来存储时间数据,时间戳本身是一个和时区无关的东西,但是由于TDengine要把数据查询出来展示给世界上不同地区的用户看,就和时区有关系了。在INTERVAL中,如果是自然日,自然月,自然年,均以TDengine服务端所在时区的0点为起始时间进行时间窗口区分。如果是以h(小时)及以下为单位切分窗口,那么进行窗口切分的起始时间就是UTC时区的0点。

不论是哪个时区的客户端,最终的计算列结果都是一致的,只是由于时区不同,所以显示的时候在时间戳列上会有一些偏差。因此我们强烈建议,非特殊情况下,客户端服务器和服务端服务器的时区要保持一致,从而使得两边的查询显示是一致的,从而减少不必要的误解。

比如,左侧客户端count(*)看起来应该是1 4 2,实际上却是4和3。这就是因为两边时区不一致导致的视觉差异。这时候就要以服务端的显示为准:6月30日有4条数据,7月1日有3条数据——TDengine服务端所在服务器的查询结果,永远是所见即所得的正确。

搞清楚了INTERVAL对于自然日月年和时分秒的不同切分逻辑后,接下来,我们终于可以说一下OFFSET了。

OFFSET其实是INTERVAL功能的偏移值。通过调整OFFSET值,就可以在时间轴上自由选择时间窗口的起始点。从而完成不同时区的数据分析统计。

比如,服务端当前的时区是东八区,但是我们想知道在东五区时区下,设备t1的每个月数据总量。就可以这样写:

select sum(t) from t1 interval(1n,3h) ;

但是由于OFFSET目前暂时不能支持负值,所以时间窗口的起点只能从时区东向西偏移。因此如果想用时区偏移功能统计24个时区,暂时可以把服务端所在的服务器时区设置为东十二区(UTC-12)。

作为一个定位国际化的产品,我们后面会继续完善相关的功能。如果想了解更多更具体的细节,可以在GitHub上查看相关源代码。

[td指标使用技巧(td指标源码)]

引用地址:https://www.gupiaohao.com/202304/28657.html

tags: