通过数据库显示高频数据实时曲线,是否可行?

时间:2017-03-01 08:53:53

标签: wpf database oracle real-time-data livecharts

监测项目,16个传感器,采样频率50hz,采用oracle数据库,结构简单:record_time + sensor_data。

offlineHeuristic->learn(state, action, reward)

我使用livecharts wpf控件来读取数据库,显示实时曲线。

要求:20ms显示数据,曲线左移,无显示暂停。

现在有两种方法可以读取数据库:

  1. 定期刷新

    Create Table real_data( record_time timestamp(3), ac_1 Float, ac_2 Float, ac_3 Float, ac_4 Float, ac_5 Float, ac_6 Float, ac_7 Float, ac_8 Float, ac_9 Float, ac_10 Float, ac_11 Float, ac_12 Float, ac_13 Float, ac_14 Float, ac_15 Float, ac_16 Float ) Tablespace data_test;

  2. 问题是间隔1秒,读取数据库中最新的1秒数据(约50个数据),曲线有一个暂停(每1秒左移一次);转移到20ms刷新,读取最新数据并插入曲线后,多次读取相同的数据,因为数据库查询时间在100ms左右(选择顶部),导致很多直线曲线,不符合实际的变化趋势。

    1. 使用线程,特别是一个线程来读取数据库,选择开始时间,偶尔会有暂停,分析的原因:读取数据的时间一般是20ms,偶尔会有300ms,因为数据库有都经常插入和删除,而操作系统内存也是实时更改,会影响读取速度。时间越长,曲线延迟越严重。
    2. 是否高频数据显示,通过数据库读取方式是不可行的?只有通过直接读取设备API可行吗?

      谢谢!

1 个答案:

答案 0 :(得分:2)

您问,如何更快地刷新图表,而不是暂停查询数据库。我不是技术大师,但我知道可能对你有用的“作弊”。而不是在图表上显示当前值,而是显示一秒钟前的值,基本上是缓冲。

所以我的想法是你有一个每500ms读取一次数据的线程,并将读取的数据存储到内存中。然后你有另一个图表更新线程,每20ms从内存中获取一个结果集并绘制它。这将使图表看起来平滑且没有停顿,数据曲线也将是准确的。唯一的缺点是图表没有显示“实时”数据,而是500ms前的数据延迟版本。

这就是我的意思:

0秒 - 传感器开始,图表上没有视觉

0.5秒 - 在DB中设置25个数据,查询DB(选择1~25),图表上没有可视化

1秒 - 在数据库中设置50个数据,查询数据库(选择26~50),在接下来的500毫秒内开始在图表上显示结果1~25。

1.5秒 - 在DB中设置75个数据,查询DB(选择51~75),在接下来的500ms内开始在图表上显示结果26~50。