通过数据库高频数据实时曲线显示,可行吗?
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显示一条数据,曲线左移,无显示停顿。
现在两种读取数据库的方式:
定期刷新
Timer = new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds(1000)
};
问题是间隔1秒,读取数据库中最新的1秒数据(约50条数据),曲线有停顿(每1秒左移一次);调到20ms刷新,读取最新数据后插入曲线,多次读取同一个数据,因为数据库查询时间在100ms左右(selecttop),导致出现很多直线曲线,不符合实际变化趋势。
- 线程的使用,具体一个线程读取数据库,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。
监控项目,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显示一条数据,曲线左移,无显示停顿。
现在两种读取数据库的方式:
定期刷新
Timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(1000) };
问题是间隔1秒,读取数据库中最新的1秒数据(约50条数据),曲线有停顿(每1秒左移一次);调到20ms刷新,读取最新数据后插入曲线,多次读取同一个数据,因为数据库查询时间在100ms左右(selecttop),导致出现很多直线曲线,不符合实际变化趋势。
- 线程的使用,具体一个线程读取数据库,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。