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

High-frequency data real-time curve display through database , is it feasible?

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

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;

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

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

现在两种读取数据库的方式:

  1. 定期刷新

    Timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(1000) };

问题是间隔1秒,读取数据库中最新的1秒数据(约50条数据),曲线有停顿(每1秒左移一次);调到20ms刷新,读取最新数据后插入曲线,多次读取同一个数据,因为数据库查询时间在100ms左右(selecttop),导致出现很多直线曲线,不符合实际变化趋势。

  1. 线程的使用,具体一个线程读取数据库,select启动时间,偶尔有停顿,分析原因:读取数据的时间一般为20ms,偶尔300ms,因为数据库有频繁的insert和delete,同时操作系统内存也在实时变化,会影响读取速度。而且时间越长,曲线延迟越严重

是否高频数据展示,通过数据库读取的方式不可行?只能通过直接读取设备API可行吗?

谢谢!

您在问,如何在不暂停的情况下比查询数据库更快地刷新图表。我不是技术专家,但我知道 "cheat" 可能对您有用。不是在图表上显示当前值,而是显示一秒钟前的值,基本上是缓冲。

所以想法是你有一个线程,每500ms读取一次数据,并将读取的数据存储到内存中。然后你有另一个用于图表更新的线程,它每 20 毫秒从内存中获取一个结果集并绘制它。这样可以使图表看起来流畅,没有停顿,数据曲线也会准确。唯一的缺点是图表没有显示 "live" 数据,而是 500 毫秒前数据的延迟版本。

这就是我的意思:

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

0.5 秒 - DB 中的 25 个数据集,查询 DB (select 1~25),图表上没有视觉效果

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

1.5 秒 - 数据库中的 75 个数据集,查询数据库 (select 51~75),在接下来的 500 毫秒内开始在图表上显示结果 26~50。