c# - 实时优化传感器数据,通过省略条目来减少日志文件的大小

标签 c# algorithm csv optimization

多次更新以更好地描述当前的实现及其所缺少的使用。
我想做的是:
我想记录实时传感器数据(电压)到一个日志文件(CSV)的大小有效的方式(最少的行数)。
每行必须包含特定时间戳上的所有传感器数据这应该允许简单的图形化,X轴是时间。
目前,每秒钟都会添加一个包含所有传感器数据的新行。
一个典型的问题是,传感器数据在几天内(类似的电压)没有变化,但随后在短时间内每隔几秒突然变化(大电压变化)。
在这种情况下,我希望优化日志文件,使其在数据变化不大的情况下只包含很少的点,但仍能捕获快速变化的周期。
例如,在下面的一组数据中,我只希望在数据变化超过10时有一个新的点。

+-----------------------------+
|  Time(sec) Value1   Value2  |
+-----------------------------+
| 1           0        0      |
| 2           5        3      |
| 3           0        1      |
| ...thousand entries...      |
| 1001        15       1      |
| 1002        12       4      |
| 1003        2        1      |
| 1004        3        2      |
|         ...............     |
+-----------------------------+

理想情况下,输出为:
+-----------------------------+
|  Time(sec) Value1   Value2  |
+-----------------------------+
| 1           0        0      |
| 1000        5        3      | <<last value? Mean? extrapolation?
| 1001        15       1      |
| 1002        12       4      | <<last value? Mean? extrapolation?
| 1003        2        1      |
|         ...............     |
+-----------------------------+

该算法必须处理大的突然值变化,结果看起来像是逐渐增加的,如果在上面的例子中只有110011003点包含在输出中,就会发生这种情况。
它看起来像一个金字塔而不是一个台阶的变化!
它们也是一些细节,例如在上面的输出示例中,点1000,它应该是阶跃变化之前的最后一个点,还是1-1000之间所有点的平均值?
理想地,存在一种算法,其中优化输出尽可能精确地表示输入波形。
当前实施
目前,所有传感器数据每秒保存一次到csv文件。然后,它被非技术人员用来在excel中查看趋势,或者通过绘制图表来查看类似的趋势。
生成的文件通常非常大。
研究
我看了一眼Online Linear Regression但是我不认为我想要的是曲线拟合。
基本上我不知道该搜索什么关键字来描述这个问题我试过以下方法:
“如何优化csv文件中捕获的数据”
“通过数据更改算法进行实时数据优化”
“通过点删除进行实时数据优化”
运行长度编码或其他编码模式压缩将不再允许用户打开输出文件以便于绘图。首先得解码。
"Online Algorithm"是以串行方式处理输入的一般算法类的名称
问题:
生成的csv文件必须仍然是可读的,并且能够在excel或类似文件中轻松地绘制图形。这就排除了对csv文件中条目数的压缩或编码。
它们是这类问题/算法的名称吗?
有常用的算法吗?(我在用c编程)
更新1
另一种描述我将要发生的事情:
每秒进行一次新的测量
算法每次接收一个测量值
算法输出必须选择/生成最小数量的点,如果每个点由一条线连接,则这些点将表示原始波形。
算法必须“在线”生成此输出。它没有完整的数据集。
这种描述更好地捕捉到输出必须是表示原始波形的一组点。
一旦在excel或类似文件中绘制出图形,输出必须与输入波形相似。这些工具通常只是线性连接点。
下面是算法应该做的两个例子。输入数据被简化为用较少的点表示。(注意:示例之间的y刻度不相同,优化强度将由用户控制)
更新2
看起来我所看到的可能与:
“在线分段线性插值”
我发现“分段线性插值”试图看看它们是否适用于流数据。
更新3
“分段线性插值”也不是很正确的算法这将在现有点之间进行线性插值,而我想生成一组新的点来表示原始数据。
也许从上一个结开始就一直监视传入的数据,一旦所有数据不再由一行表示,就插入一个新结并重新启动?显而易见的问题是如何最佳地选择结在哪里。。
最终更新
在下面添加了我自己的答案。算法称为“直线简化算法”或“下采样/数据压缩”算法。“下采样/数据压缩”似乎更适合流式数据。
很可能会使用“风扇”数据压缩算法来解决我的问题。

最佳答案

如果电压在很长一段时间内没有变化,你只需要run-length encoding,这可以通过比较你将要保存的值和上次保存的值来快速完成。
如果您想忽略小于某个小的指定量的电压变化,那么您可以简单地将上述等式比较更改为差异大小的测试:is|curValue - lastWrittenValue| > threshold?--像以前一样使用RLE。

关于c# - 实时优化传感器数据,通过省略条目来减少日志文件的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29605141/

相关文章:

C# Math.NET Numbers 中的线性回归代码可以变得更快吗?

algorithm - 在字符串缓冲区/段落/文本中查找单词

algorithm - 有效地从两个文件中找到所有常见模式(子字符串)

python - 搜索 csv 的值,代码在 ipython 中有效,但在程序中使用时无效

c# - 静态或非静态方法,线程安全是针对类型而不是方法

c# - 存储过程 Postgresql 和 C# WPF

python - 读取每个文件后如何写入新行?

python - 用多个变量替换 pandas 中的多列

c# - 如何在 Nsubstitute 中使用内部服务?

algorithm - 知识有限且无距离启发式寻路