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

如何在Python中正确地分离数据采集、处理和可视化?,python,data-acquisition,Python,Data Acquisition,我正在从事一个项目,我想使用pyqt和pyqtgraph在Python中执行数据采集、数据处理和GUI可视化。每个部分原则上都已实现,但不同的部分没有很好地分离,这使得很难对性能进行基准测试和改进。因此,问题是: 在软件的不同部分之间是否有处理大量数据的好方法 我想到了如下场景: 采集:从某些设备获取数据,并将其存储在可以从其他地方访问的数据容器中。此部件应能够在没有处理和可视化部件的情况下运行。这部分是时间关键的,因为我不想丢失数据点! 处理:从数据容器中获取数据,对其进行处理,并将结果存储在

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

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

我想到了如下场景:

采集:从某些设备获取数据,并将其存储在可以从其他地方访问的数据容器中。此部件应能够在没有处理和可视化部件的情况下运行。这部分是时间关键的,因为我不想丢失数据点! 处理:从数据容器中获取数据,对其进行处理,并将结果存储在另一个数据容器中。此外,该部分应能够在没有GUI的情况下运行,并在采集后延迟运行,例如,我上周记录的过程数据。 GUI/可视化:从容器中获取和处理的数据,并将其可视化。 保存数据:我希望能够将数据的某些部分存储/流式传输到磁盘。 当我说大量数据时,我的意思是,我得到的阵列大约有200万个数据点,每秒16位,需要处理,可能还需要存储

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

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

例如,有些测量会生成大量数据,处理这些数据的唯一方法是事后处理:

通常将数据获取到存储器中 对数据进行后处理 分析结果 选择并归档子集 小数据 如果您的计算机系统能够跟上数据生成的速度,那么可以在每个阶段之间使用单独的Python

大数据 如果您的测量所创建的数据超过了系统所能消耗的数据量,那么您应该从定义几层开始,也许只是定义数据重要性的两层:

无损-如果缺少一个点,那么你最好重新开始 有损-如果点或一组数据丢失,没有什么大不了的,只需等待下一次更新 一个类比可能是视频流

无损黄金档案大师 有损-YouTube、Netflix、Hulu可能会掉几帧,但你的体验不会受到明显影响 根据您的描述,采集和处理必须是无损的,而GUI/可视化可能是有损的

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

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

:P-C模拟FIFO-一个参与者生成数据,另一个参与者使用数据。你可以建立一个生产者/消费者链来实现你的目标。 :虽然P-C通常是一对一,但观察者模式也可以是一对多。如果您需要多个参与者在一个源发生变化时做出反应,那么观察者模式可以为您提供这种能力。 :调解人通常是多对多的。如果每个参与者都能让其他参与者做出反应,那么所有参与者都可以通过调解人进行协调。
似乎您只需要在每个阶段之间建立1-1关系,因此生产者-消费者设计似乎适合您的应用程序。

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