Python +pyqt5,如何处理高速采集的数据

2021-03-15 20:29:41 +08:00
 HITMengbin
因为工作需要,使用 pyqt5 设计了一个工具,用于接收设备通过 UDP 发送的数据,数据最快 10us 发送一次,每次一帧 50 个字节,接收到数据后,需要对数据进行保存到 excel 中,并且需要在 pyqt5 编写的界面上实时展示。现在遇到的问题是因为保存到 excel 和显示到界面上,需要花费时间,导致最后数据出现大量丢帧现象。请问大家,针对这种高速数据采集的情况,大概怎么处理呢?
先存到数据库然后再读出并写入 excel 和显示到界面上的吗?
2232 次点击
所在节点    Python
18 条回复
gainsurier
2021-03-15 20:33:12 +08:00
python -> c++
Excel -> 时序库
HITMengbin
2021-03-15 20:41:33 +08:00
@gainsurier 暂时换不到 C++l ,现在也在考虑换到数据库来弄了
rqrq
2021-03-16 02:24:58 +08:00
必须要实时吗,缓冲两秒行不行
dayeye2006199
2021-03-16 04:38:53 +08:00
设备和 UI 的通讯之间,可以接一套 kafka 之类的消息队列。设别发送信息到 kafka 上,UI 侧订阅信息,刷新界面;保存到 excel 可以单独起一个进程,订阅同样的 kafka 主题,处理之后写入 excel 。
supermoonie
2021-03-16 07:27:36 +08:00
不用每一次都展示在界面上吧,人的眼睛反应时间好像在 300ms 左右,10us 刷新一次也太快了。。。试试先接收,然后批量展示保存呢
levelworm
2021-03-16 08:10:16 +08:00
我觉得楼上哥们说的很好,你得先看看真实需求是什么样子。是需要收集所有数据+展示所有数据,还是收集所有数据+展示部分数据,或者是收集部分数据+展现部分数据。
HITMengbin
2021-03-16 09:25:04 +08:00
@supermoonie 倒也不用 10us 刷新一次,所以现在的想法是先保存到数据库再刷新,10us 这个速度太快了,显示出来也没必要,人看不出来,主要是看能不能完全保存下来
HITMengbin
2021-03-16 09:25:55 +08:00
@levelworm 哥们说的是,在 us 级的速度时,收集全部数据+展示部分数据或者干脆不展示
supermoonie
2021-03-16 09:46:26 +08:00
@HITMengbin 既然展示的时间间隔宽松了,也没必要全都保存,100ms 保存一次或者取单位时间内的均值或者中位数保存应该也可以
HITMengbin
2021-03-16 10:08:54 +08:00
@supermoonie 要求 100us 级别的必然全部保存,后续数据分析
ch2
2021-03-16 10:32:11 +08:00
这个问题跟数据库压根没关系,是你的操作得分 batch 来
UI 方面你只要保证够 60 帧就行了,再高用户是感受不出来的。10us 刷新一次=100000fps,远远高于实际所需。正确的做法是,用限流器的思想,每 10ms 刷新一次,这样你也有 100fps 了
然后自动保存数据是每隔 10 秒保存到 excel 文件里,如果数据量上百兆的话,磁盘 IO 也会花很久时间的
你并不需要实时就把数据显示到界面或者保存到文件,攒够一定的 batch_size 再更新一次才对
no1xsyzy
2021-03-16 10:33:16 +08:00
吃了问题描述不清的亏

是你接收不及时被丢弃了吗?
是否考虑模型视图隔离( MVC 的 M 和 V 隔离啊)
你如果每到一个包都显示,修改界面花的时间就不止 10us 。
HITMengbin
2021-03-16 11:13:38 +08:00
@no1xsyzy 是接收不及时,缓存满了之后后续的就会丢失
现在就是想直接分开,估计比较麻烦
u823tg
2021-03-16 13:31:59 +08:00
看你描述最主要的是 100us 保存一次,显示根本就不用考虑。 那个时间间隔的 ui 刷新是钛合金眼吗。 直接把问题简化成 100us 保存一次。
HITMengbin
2021-03-16 14:45:13 +08:00
@ch2 老哥这方法我可以试试看
HITMengbin
2021-03-16 14:45:38 +08:00
@u823tg 哈哈哈,是的,超快速度的后期就只考虑保存,不显示了
u823tg
2021-03-16 15:03:49 +08:00
@HITMengbin #16 觉得最主要的是不丢数据,开个进程接收数据,然后通过管道扔给另一个进程去处理保存操作去。
HITMengbin
2021-03-16 15:12:48 +08:00
@u823tg 是的,超短时间的不丢数据就成了。目前在试的是存入数据库先

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/761881

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX