V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
HITMengbin
V2EX  ›  Python

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

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

    是你接收不及时被丢弃了吗?
    是否考虑模型视图隔离( MVC 的 M 和 V 隔离啊)
    你如果每到一个包都显示,修改界面花的时间就不止 10us 。
    HITMengbin
        13
    HITMengbin  
    OP
       2021-03-16 11:13:38 +08:00
    @no1xsyzy 是接收不及时,缓存满了之后后续的就会丢失
    现在就是想直接分开,估计比较麻烦
    u823tg
        14
    u823tg  
       2021-03-16 13:31:59 +08:00
    看你描述最主要的是 100us 保存一次,显示根本就不用考虑。 那个时间间隔的 ui 刷新是钛合金眼吗。 直接把问题简化成 100us 保存一次。
    HITMengbin
        15
    HITMengbin  
    OP
       2021-03-16 14:45:13 +08:00
    @ch2 老哥这方法我可以试试看
    HITMengbin
        16
    HITMengbin  
    OP
       2021-03-16 14:45:38 +08:00
    @u823tg 哈哈哈,是的,超快速度的后期就只考虑保存,不显示了
    u823tg
        17
    u823tg  
       2021-03-16 15:03:49 +08:00
    @HITMengbin #16 觉得最主要的是不丢数据,开个进程接收数据,然后通过管道扔给另一个进程去处理保存操作去。
    HITMengbin
        18
    HITMengbin  
    OP
       2021-03-16 15:12:48 +08:00
    @u823tg 是的,超短时间的不丢数据就成了。目前在试的是存入数据库先
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5525 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 01:31 · PVG 09:31 · LAX 17:31 · JFK 20:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.