【问题标题】:How to compress/archive a temperature curve effectively?如何有效地压缩/归档温度曲线?
【发布时间】:2017-01-04 22:30:43
【问题描述】:

总结:工业温度计用于在技术设备处对温度进行采样。几个月来,样本只是简单地存储在 SQL 数据库中。是否有任何众所周知的方法可以压缩温度曲线,从而可以有效地存储更长的历史记录(例如出于审计目的)?

更多细节:实际上,温度计要多得多,可能还有其他与该技术相关的传感器。并且曲线属于在机器上处理的批处理中有众所周知的时间间隔。应将温度曲线添加到批处理文档中。

我的想法是温度是一个可以以某种方式进行插值的平滑函数——比如使用 MP3 格式压缩声音的方式。压缩不需要是松散的。但是,必须可以重建温度曲线(不一定是相同的样本值和相同的采样间隔)——例如,能够绘制曲线或判断特定时间的温度。

将处理来自 SQL 表的原始样本值,压缩版本将存储在其他地方(可能也在 SQL 数据库中,作为 blob),稍后可以删除原始样本以节省数据库空间。

是否有任何众所周知且广泛使用的方法来解决这个问题?

【问题讨论】:

  • 大多数(全部?)SQL 数据库都支持数据的透明压缩,最好是列式存储,这样可以更有效地利用数据关联。但是我们在这里讨论了多少数据?此外,对于某些不需要存储原始历史数据的用例,平均值和百分位数等聚合对于您的用例可能就足够了。如果历史数据不需要随时可用,您可以将其转储到压缩文件中并上传到例如 Amazon S3。

标签: database compression sampling plc opc


【解决方案1】:

一种简单的方法是将温度编码为一个字节或两个字节,具体取决于您需要的范围和精度,然后将第一个温度写入您的输出,然后是其余所有温度之间的差异。对于两字节温度,您可以限制一些范围并写入一个或两个字节,具体取决于与可变长度整数的差异。例如。如果设置了第一个字节的高位,则下一个字节包含 8 位以上的差异,允许 15 位差异。根据您的描述,大多数情况下它将是一个字节。

然后获取该流并将其馈送到标准无损压缩器,例如zlib.

任何损失都应该在采样步骤中引入,只编码你真正需要的位数来编码所需的范围和精度。然后,该过程的其余部分应该是无损的,以避免解压缩值出现系统性漂移。

减去连续值是最简单的预测器。在这种情况下,下一个值的预测是它之前的值。它也可能是最有效的,具体取决于数据的噪音。如果您的数据真的很平滑,那么您可以尝试使用更高阶的预测器来查看是否可以获得更好的性能。例如。使用最后两个点的下一个点的预测器是 2a - b,其中 a 是前一个点,b 是之前的点,或使用最后三个点3a - 3b + c,其中cb 之前的点。 (这些假设每个之间的时间步长相等。)

【讨论】:

  • 这是个好主意!信号(限制为最小、最大间隔的浮点数)可以量化为整数。最小值和最大值之间的 64 K 步长可以为许多工业信号(如温度、压力等)带来相当好的精度。然后,如果值变化不会太快或需要非常频繁地采样,则 delta 编码可确保较小的值。我想关键是选择一个合适的预测函数。如何正确选择它背后有什么理论吗? (可能在数据分析之后?)
  • “久等了,感谢所有...zlib” :)
  • 只需使用您的数据尝试我的答案中的预测变量,看看压缩后哪个输出最小。
  • 如果您实际使用数据库进行存储,请意识到如果您使用“先前值依赖预测器算法”,那么为了了解记录 N 的实际值,您必须查询所有记录从 1..N-1 计算记录 N 的值的含义。这违背了使用数据库进行查找的目的。模拟信号的范围有限,因此请在信号中间选择一个增量并将其分解为 256(签名字节)或 65536(签名字)“刻度”以获得所需的分辨率。然后,您可以从中间/刻度分辨率值计算工程单位。
  • @franji1(实际上,您的意思是 UNSIGNED :),将“原始”样本存储在数据库中是获取数据方式的结果。我无法改变方式。如果有意义的话,我想要的是对一些数据进行一些后处理(比如时间的温度)。在我的情况下不需要查找。我可以使用数据库游标按顺序获取值。 (这里没问题。而且样本的后期重建不需要非常快。)
猜你喜欢
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2016-08-05
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多