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

时间:2015-01-06 14:02:02

标签: python data-acquisition

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

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

我想到以下情况:

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

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

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

1 个答案:

答案 0 :(得分:2)

多少数据?

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

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

  1. 将数据存储到存储空间(通常为RAID0
  2. 后处理数据
  3. 分析结果
  4. 选择并存档子集
  5. 小数据

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

    大数据

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

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

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

         
        
    • 无损 - 存档的黄金大师
    •   
    • 有损 - YouTube,Netflix,Hulu可能会降低几帧,但您的体验不会受到太大影响
    •   

    根据您的说明,获取处理必须无损,而 GUI /可视化可以是有损

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

    设计

    无论您的数据容器如何,以下是连接阶段的三种不同方法:

    1. Producer-Consumer:P-C模仿FIFO - 一个actor生成数据而另一个使用它。您可以建立一系列生产者/消费者来实现您的目标。
    2. Observer:虽然P-C通常是一对一的,但观察者模式也可以是一对多。如果您需要多个actor在一个源更改时做出反应,则观察者模式可以为您提供该功能。
    3. Mediator:调解员通常是多对多的。如果每个演员都能引起其他演员的反应,那么所有演员都可以通过调解员进行协调。
    4. 您似乎只需要在每个阶段之间建立1-1关系,因此生产者 - 消费者设计看起来会适合您的应用。