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

标签 python data-acquisition

<分区>

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

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

我想到了类似下面的场景:

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

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

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

最佳答案

有多少数据?

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

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

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

小数据

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

大数据

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

  • 无损 -- 如果缺少一个点,那么您不妨重新开始
  • lossy -- 如果缺少点或一组数据,没什么大不了的,只需等待下一次更新

One analogy might be a video stream...

  • lossless -- gold-masters for archival
  • lossy -- YouTube, Netflix, Hulu might drop a few frames, but your experience doesn't significantly suffer

根据您的描述,AcquisitionProcessing 必须无损,而GUI/可视化 可以有损

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

设计

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

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

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

关于python - 如何在Python中正确分离数据采集、处理和可视化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27800260/

相关文章:

python - 如何排除数据框中的连续值

python - 如何让 Marshmallow-Sqlalchemy 按关联对象字段排序?

python - Pinax中ACCOUNT_OPEN_SIGNUP = False时如何邀请?

python - 将行附加到 Pandas DataFrame

matlab - 能同步Matlab的数据采集工具箱和图像采集工具箱吗?

python - 了解 python 中的文件位置 - 意外错误

python - 如何创建一个 tzinfo 设置为 'UTC' 的日期时间对象?

c++ - 时序问题 : QT write to serial port followed by read

python - 使用 Python 获取基于 Spark 塞驱动的内燃机状态

Python:使用 pyvisa 或 pyserial 获取设备 "model"