如何在Python中正确分离数据采集,处理和可视化?

eri*_*rik 6 python data-acquisition

我正在开发一个项目,我希望在Python中执行数据采集,数据处理和GUI可视化(使用pyqt with pyqtgraph).原则上实现了每个部件,但是不同的部件没有很好地分开,这使得难以进行基准测试和改进性能.所以问题是:

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

我想到类似以下情况:

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

当我说"大量数据"时,我的意思是我得到的数据每秒大约有200万个数据点(16位),需要处理并可能也存储.

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

Joe*_*sen 2

有多少数据?

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

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

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

小数据

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

大数据

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

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

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

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

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

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

设计

无论您的数据容器如何,都可以通过以下三种不同的方式来连接阶段:

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

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