2. PI Data Archive存储架构解析

PI Data Archive 是 PI System 的时序数据核心,它并不是一个简单的“实时数据库”,而是一套围绕PI 点(PI Point)组织、以事件(Event)为最小数据单元、由快照(Snapshot)与归档文件(Archive File)协同承载的存储体系。理解这套架构,是后续做高频写入、查询优化和容量规划的前提。

PI 点:数据存储的逻辑锚点

PI 点是一个被命名的数据通道,例如 sinusoid、BA:ACTIVE.1 或 CDT158。每个 PI 点拥有唯一的 Point ID(内部整数标识)和 Tag Name(用户可读名称)。归档文件中真正存储的是 Point ID 与时间戳、数值的组合,Tag Name 只是索引层。因此重命名 Tag 不会重写历史数据,而删除并重建同名 Tag 会得到新的 Point ID,历史数据不会自动继承。

PI 点的关键属性直接影响存储行为:PointType(Float32、Float64、Int32、Digital、String 等)决定单个事件占用的字节数;CompDev(压缩偏差)决定是否记录新事件;CompMax(最大压缩时间)强制在长时间无显著变化时仍写入一个事件;ExcDev 与 ExcMax 则在接口层做异常过滤。这些参数共同决定了“数据到底写多少”。

事件、时间戳与精度

事件是 PI 中不可再分的数据记录,形式为 (timestamp, value, quality)。时间戳采用 UTC 存储,显示时按客户端时区转换。PI Data Archive 的时间戳精度为 1/10000 秒(100 微秒),即内部以 100 纳秒为最小刻度、但实际有效分辨率为 0.1 毫秒。这意味着同一 PI 点在 0.1 毫秒内到达的多个值无法被区分先后,高频场景下必须注意这一点。

质量码(Quality)常见取值包括 Good、Bad、Questionable、Substituted 等。查询时若不加过滤,Bad 值也会被返回,因此做统计计算前通常需要判断质量。

快照与归档文件的分工

PI Data Archive 采用“快照 + 归档”两级结构。快照保存每个 PI 点最新一个事件,常驻内存并周期性落盘,用于快速响应“当前值”查询。归档文件则是历史事件的持久化容器,每个归档文件默认约 2 GB(可配置),写满后切换到下一个归档文件,形成归档序列。

写入路径可以概括为:接口采集 → 事件进入快照 → 满足压缩条件时追加到当前归档 → 归档写满后滚动。查询“当前值”走快照,查询历史区间则需扫描对应时间范围内的归档文件。因此,归档文件的数量、时间跨度和分布直接决定历史查询的 I/O 成本。

PI Data Archive 存储架构与写入路径 采集接口 PI Interface / Connector 异常过滤 ExcDev / ExcMax 压缩判断 CompDev / CompMax 快照 Snapshot 每点最新事件 · 内存 归档文件序列(Archive Files) Archive #1 已写满 · 只读 约 2 GB Archive #2 已写满 · 只读 约 2 GB Archive #3 当前写入 · 可读写 约 2 GB Archive #4 待创建 滚动切换 满足压缩条件时追加 当前值查询 → 快照 低延迟 · 内存命中 历史区间查询 → 归档文件 扫描对应时间范围的归档 · I/O 密集 时间戳精度:1/10000 秒(100 微秒) · 事件结构:(timestamp, value, quality) 归档文件默认约 2 GB · 写满后滚动切换 · 归档数量与时间跨度决定历史查询成本

数据压缩机制

PI 的压缩不是“有损压缩算法”,而是一种基于偏差的过滤策略。当新采集值到达时,系统会比较它与“上一条已存储事件”之间的偏差:若偏差超过 CompDev,则写入新事件;若未超过,则暂不写入,但快照仍会更新为最新值。CompMax 则保证即使长期无显著变化,也会在超过设定时间后强制写入一个事件,避免出现“数据空洞”。

举例说明:某 PI 点 CompDev = 0.5,CompMax = 600 秒。假设上一条存储事件值为 100.0,随后采集到 100.2、100.3、100.6。前两个值偏差均小于 0.5,不写入归档;100.6 与 100.0 偏差 0.6 超过阈值,写入新事件。若期间一直未超过阈值,则 600 秒后强制写入当前快照值。这样既保留了趋势特征,又大幅减少存储量。

压缩参数是“存储量”与“查询精度”之间的调节旋钮。CompDev 越大,存储越省,但历史曲线越粗糙;CompDev 越小,曲线越精细,但归档增长越快。高频场景下应结合信号变化速率和业务精度要求逐点设置,而不是全局统一。

高频场景下的存储行为

当采集频率达到毫秒级时,存储压力主要来自三方面:事件写入速率、归档滚动频率和快照更新频率。假设 1000 个 PI 点以 100 ms 周期采集,且每个点每次采集都超过 CompDev,则每秒产生 10000 个事件。按每个 Float32 事件约 16 字节估算,每天约产生 13.8 GB 原始事件数据,归档文件会以每天约 7 个的速度滚动。

此时需要关注:归档文件数量过多会导致历史查询需要打开大量文件;快照更新过于频繁会占用内存带宽;接口层若未做异常过滤,Bad 值也会进入压缩判断,浪费存储。优化方向包括:合理设置 ExcDev 在接口层先过滤明显异常;对高频点适当增大 CompDev;将归档文件大小调大以减少文件数量;对确实需要原始精度的点,考虑使用 PI Buffer Subsystem 或独立的高频归档策略。

PI Data Archive 的时间戳精度为 100 微秒,若采集周期小于该精度,多个事件可能被赋予相同时间戳,导致排序和查询结果不稳定。高频场景下应确认采集周期与时间戳精度匹配,必要时在接口层做时间对齐或降频聚合。

归档文件与查询性能的关系

历史查询的性能取决于需要扫描的归档文件数量和时间范围。PI Data Archive 会为每个归档文件维护时间索引,查询时先定位时间范围覆盖的归档文件,再在文件内检索。若查询跨越大量归档文件,I/O 开销会显著上升。因此,在容量规划时不仅要看总存储量,还要看单位时间产生的归档文件数。对于高频数据,适当增大单个归档文件大小、减少归档数量,通常比单纯增加磁盘容量更能改善查询体验。

综合来看,PI Data Archive 的存储架构可以理解为:PI 点定义通道,事件定义数据,快照提供最新值,归档提供历史,压缩机制控制数据量,时间戳精度界定分辨率。高频场景下的所有优化,本质上都是在这几个要素之间寻找平衡。