【问题标题】:How to separate data acquisition, processing, and visualization properly in Python? [closed]Python中如何正确分离数据获取、处理和可视化? [关闭]
【发布时间】:2015-01-06 14:02:02
【问题描述】:

我正在做一个项目,我想在 Python 中执行数据采集、数据处理和 GUI 可视化(使用 pyqt 和 pyqtgraph)。每个部分都在原则上实现,但不同部分没有很好地分离,这使得难以对标和提高性能。所以问题是:

有没有一种很好的方法来处理软件不同部分之间的大量数据?

我想到了类似以下场景:

  • 获取:从一些设备获取数据并将它们存储在一些可以从其他地方访问的数据容器中。 (这部分应该可以在没有处理和可视化部分的情况下运行。这部分时间很紧迫,因为我不想丢失数据点!)
  • 处理:从数据容器中获取数据,对其进行处理,并将结果存储在另一个数据容器中。 (此外,这部分应该能够在没有 GUI 的情况下运行,并且在采集后有延迟(例如,我上周记录的过程数据)。)
  • GUI/可视化:从容器获取获取和处理的数据并将其可视化。
  • 保存数据:我希望能够将数据的某些部分存储/流式传输到磁盘。

当我说“大量数据”时,我的意思是我得到了每秒大约有 200 万个数据点(16 位)需要处理和存储的数组。

是否有任何 Python 框架可以用来正确处理如此大量的数据?也许以我可以连接到的数据服务器的形式。

【问题讨论】:

  • 我不是专家,但我想你可以看看:模型视图控制器设计模式(即使它只是 Qt 中的模型视图),也许还有pandas (@987654321 @)? MVC 是关于数据的分离及其在 GUI 中的表示,而 pandas 是关于处理大量数据。我希望这对你来说是一个开始!
  • 我记得在 LabView 中,一种常见的方法是在Producer/Consumer pattern 中通过队列连接并行循环。 “采集”循环可能比“图形”循环具有更高的优先级,以避免丢失数据。但是我刚刚开始使用 Python 进行采集,不知道最好的方法——例如,你不能设置线程的优先级,AFAIK。我也对答案感兴趣。

标签: python data-acquisition


【解决方案1】:

有多少数据?

换句话说,您是否获取了太多数据,以至于无法在需要时将所有数据都保存在内存中?

例如,有些测量会产生如此多的数据,处理它们的唯一方法是事后:

  1. 获取数据到存储(通常是RAID0)
  2. 后处理数据
  3. 分析结果
  4. 选择和归档子集

小数据

如果您的计算机系统能够跟上数据的生成,您可以在每个阶段之间使用单独的 Python queue。

大数据

如果您的测量创建的数据超出系统可以使用的数据,那么您应该首先定义数据重要性的几个层级(可能只有两个层级):

  • 无损 -- 如果缺少一个点,那么你还不如重新开始
  • 有损 -- 如果点或一组数据丢失,没什么大不了的,等下一次更新

一个类比可能是视频流...

  • 无损 -- 档案的金牌大师
  • 有损 -- YouTube、Netflix、Hulu 可能会丢几帧,但您的体验不会受到太大影响

根据您的描述,采集和处理必须无损,而GUI/可视化可以有损。

对于无损数据,您应该使用queues。对于有损数据,可以使用deques。

设计

不管您的数据容器是什么,这里有三种不同的方式来连接您的阶段:

  1. Producer-Consumer:P-C 模仿 FIFO——一个参与者生成数据,另一个参与者消费它。您可以建立生产者/消费者链来实现您的目标。
  2. Observer:虽然 P-C 通常是一对一的,但观察者模式也可以是一对多的。如果您需要多个参与者在一个源发生变化时做出反应,观察者模式可以为您提供这种能力。
  3. Mediator:调解员通常是多对多的。如果每个参与者都能引起其他参与者的反应,那么他们都可以通过调解人进行协调。

您似乎只需要每个阶段之间的 1-1 关系,因此生产者-消费者设计看起来很适合您的应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2012-09-19
    • 2014-10-09
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多