如何在Python中正确分离数据采集、处理和可视化?
How to separate data acquisition, processing, and visualization properly in Python?
我正在做一个项目,我想在 Python 中执行数据采集、数据处理和 GUI 可视化(使用 pyqt 和 pyqtgraph)。每个部分原则上都实现了,但是不同的部分没有很好地分离,这使得很难进行基准测试和提高性能。所以问题是:
有没有好的方法来处理软件不同部分之间的大量数据?
我想到了类似以下的场景:
- 获取:从一些设备获取数据并将它们存储在一些数据容器中,可以从其他地方访问。 (这部分应该可以在没有处理和可视化部分的情况下运行。这部分时间紧迫,因为我不想丢失数据点!)
- 处理:从数据容器中取出数据,对其进行处理,并将结果存储在另一个数据容器中。 (此外,这部分应该能够在没有 GUI 的情况下运行,并且在采集后有延迟(例如,我上周记录的过程数据)。)
- GUI/visualization: 从 容器 获取并处理数据并将其可视化。
- 保存数据:我希望能够store/stream将数据的某些部分写入磁盘。
当我说 "large amounts of data" 时,我的意思是我得到的数组每秒大约有 200 万个数据点(16 位)需要处理并且可能还需要存储。
是否有任何 Python 框架可供我用来正确处理如此大量的数据?也许以我可以连接到的数据服务器的形式。
多少数据?
换句话说,您是否获取了如此多的数据,以至于无法在需要时将所有数据保存在内存中?
例如,有些测量会产生如此多的数据,处理它们的唯一方法是事后处理:
- 获取数据存储(通常RAID0)
- Post-处理数据
- 分析结果
- Select 和存档子集
小数据
如果您的计算机系统能够跟上数据生成的步伐,您可以在每个阶段之间使用单独的 Python queue。
大数据
如果您的测量产生的数据多于您的系统可以消耗的数据,那么您应该首先定义数据重要性的几层(也许只有两层):
- lossless -- 少了一个点,那还不如重新来过
- 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
根据您的描述,采集和处理必须无损,而GUI/visualization可以是有损.
对于无损数据,您应该使用queues. For lossy data, you can use deques。
设计
无论您的数据容器是什么,以下是连接阶段的三种不同方式:
- Producer-Consumer:P-C 模仿 FIFO——一个参与者生成数据,另一个参与者使用它。您可以构建 producers/consumers 链来实现您的目标。
- Observer:虽然P-C通常是一对一的,但观察者模式也可以是一对多的。如果您需要多个参与者在一个源更改时做出反应,观察者模式可以为您提供这种能力。
- Mediator: Mediator 通常是多对多的。如果每个参与者都能引起其他参与者的反应,那么所有参与者都可以通过调解器进行协调。
似乎您只需要每个阶段之间的 1-1 关系,因此生产者-消费者设计看起来很适合您的应用程序。
我正在做一个项目,我想在 Python 中执行数据采集、数据处理和 GUI 可视化(使用 pyqt 和 pyqtgraph)。每个部分原则上都实现了,但是不同的部分没有很好地分离,这使得很难进行基准测试和提高性能。所以问题是:
有没有好的方法来处理软件不同部分之间的大量数据?
我想到了类似以下的场景:
- 获取:从一些设备获取数据并将它们存储在一些数据容器中,可以从其他地方访问。 (这部分应该可以在没有处理和可视化部分的情况下运行。这部分时间紧迫,因为我不想丢失数据点!)
- 处理:从数据容器中取出数据,对其进行处理,并将结果存储在另一个数据容器中。 (此外,这部分应该能够在没有 GUI 的情况下运行,并且在采集后有延迟(例如,我上周记录的过程数据)。)
- GUI/visualization: 从 容器 获取并处理数据并将其可视化。
- 保存数据:我希望能够store/stream将数据的某些部分写入磁盘。
当我说 "large amounts of data" 时,我的意思是我得到的数组每秒大约有 200 万个数据点(16 位)需要处理并且可能还需要存储。
是否有任何 Python 框架可供我用来正确处理如此大量的数据?也许以我可以连接到的数据服务器的形式。
多少数据?
换句话说,您是否获取了如此多的数据,以至于无法在需要时将所有数据保存在内存中?
例如,有些测量会产生如此多的数据,处理它们的唯一方法是事后处理:
- 获取数据存储(通常RAID0)
- Post-处理数据
- 分析结果
- Select 和存档子集
小数据
如果您的计算机系统能够跟上数据生成的步伐,您可以在每个阶段之间使用单独的 Python queue。
大数据
如果您的测量产生的数据多于您的系统可以消耗的数据,那么您应该首先定义数据重要性的几层(也许只有两层):
- lossless -- 少了一个点,那还不如重新来过
- 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
根据您的描述,采集和处理必须无损,而GUI/visualization可以是有损.
对于无损数据,您应该使用queues. For lossy data, you can use deques。
设计
无论您的数据容器是什么,以下是连接阶段的三种不同方式:
- Producer-Consumer:P-C 模仿 FIFO——一个参与者生成数据,另一个参与者使用它。您可以构建 producers/consumers 链来实现您的目标。
- Observer:虽然P-C通常是一对一的,但观察者模式也可以是一对多的。如果您需要多个参与者在一个源更改时做出反应,观察者模式可以为您提供这种能力。
- Mediator: Mediator 通常是多对多的。如果每个参与者都能引起其他参与者的反应,那么所有参与者都可以通过调解器进行协调。
似乎您只需要每个阶段之间的 1-1 关系,因此生产者-消费者设计看起来很适合您的应用程序。