Python 需要帮助解决Raspberry Pi上matplotlib的性能问题吗

Python 需要帮助解决Raspberry Pi上matplotlib的性能问题吗,python,numpy,matplotlib,web2py,Python,Numpy,Matplotlib,Web2py,首先,我为这篇冗长的文章感到抱歉。我不熟悉python和matplotlib,所以请耐心听我说 作为后续工作,我发现使用web2py在Raspberry Pi上生成网格非常耗时。我有一个csv文件,大约有12k行,如下所示: 1;1.0679759979248047;0.0;147.0;0.0;;{'FHR1': 'US', 'FHR2': 'INOP', 'MHR': 'INOP'};69;good;;;;1455891539.502167 问题是,使用numpy.genfromtxt读取这

首先,我为这篇冗长的文章感到抱歉。我不熟悉python和matplotlib,所以请耐心听我说

作为后续工作,我发现使用web2py在Raspberry Pi上生成网格非常耗时。我有一个csv文件,大约有12k行,如下所示:

1;1.0679759979248047;0.0;147.0;0.0;;{'FHR1': 'US', 'FHR2': 'INOP', 'MHR': 'INOP'};69;good;;;;1455891539.502167
问题是,使用numpy.genfromtxt读取这些12k行已经需要30秒左右的时间。然后填充图表(没有花哨的网格)又花了30秒,只需使用csv的第1、3和7列。但加入溶液后,时间爆炸到170秒。所以现在我必须想办法把时间消耗减少到一分钟以内

我的第一个想法是消除csv——反正我是读取数据的人,所以我可以通过将数据保存在内存中或直接将其写入绘图来跳过它。我就是这么做的,(在我看来)使用一个简单的测试布局,并使用pdf后端。我选择在每次获取数据时将数据写入图表,并在传输完成后保存图表。我想那应该行得通,但是不行。我总是犯一些可笑的错误:

运行时错误:RRuleLocator估计从0001-01-01 15:20:31.883239+00:00到0001-04-17 20:52:39.779205+00:00生成9178327个刻度:超过定位器。最大刻度*2(6000000)

相信我,每次测试运行时,我都会不断增加这些最大值,以超过错误消息中显示的最大值。这太荒谬了,因为这条信息只包含60秒的数据,而我想去一个接近24小时的地方。我希望RRuleLocator停止估算,或者干脆闭嘴,等待数据结束。我真的不认为我能从中得到什么,但我能把最有可能弄糟的细节刻出来

首先,我设置了一些课程,所以没有全球课程。为了简化,我有一个通信类,它每隔一秒钟读取串行端口。这是运行良好,直到昨天写了任何进来的串行端口到一个csv。现在我想看看是否可以在获取数据时填充图表,并在完成后保存它。所以为了测试,我把这个添加到了我的.py中

import matplotlib
matplotlib.use('PDF')    # I want a PDF in the end
from matplotlib import dates
import matplotlib.pyplot as plt
import numpy as np
from numpy import genfromtxt
然后,通信类的一些成员,来自图表部分,主要是上面提到的解决方案。我在类init中初始化它们

    self.fig = None
    self.ctg = None
    self.toco = None
然后我调用这个方法,一旦我感觉到我接收的数据是正确的形式/状态,那么图表就可以准备好填充数据了

def prepchart(self):
    # how often to show xticklabels and repeat yticklabels:
    print('prepchart')
    xtickinterval = 5

    hfmt = dates.DateFormatter('%H:%M:%S')
    self.fig = plt.figure()

    self.ctg = self.fig.add_subplot(2, 1, 1)  # two rows, one column, first plot
    plt.ylim(50, 210)

    self.toco = self.fig.add_subplot(2, 1, 2)
    plt.ylim(0, 100)
    # Set the minor ticks to every 30 seconds
    minloc = dates.SecondLocator(bysecond=[0,30])
    minloc.MAXTICKS = 3000000 
    self.ctg.xaxis.set_minor_locator(minloc)
    # self.ctg.xaxis.set_minor_locator(dates.MinuteLocator())
    self.ctg.xaxis.set_major_formatter(hfmt)

    self.toco.xaxis.set_minor_locator(dates.MinuteLocator())
    self.toco.xaxis.set_major_formatter(hfmt)

    # actg.xaxis.set_ticks(rotation=45)
    plt.xticks(rotation=45)
一旦我有了想要绘制的数据,我就会在我的数据处理方法中这样做

 self.ctg.plot_date(timevalue, heartrate, '-')
 self.toco.plot_date(timevalue, toco, '-')
最后,一旦不再发送数据(可能在一分钟或24小时后),我会打电话

    def handleCTG(self):
        self.fig.savefig('/home/pi/test.pdf')

总之:我是完全错了还是代码中有错误?这真的是一种减少图表生成等待时间的方法吗?

好的,下面是交易。显然,web2py的运营非常紧张。这意味着没有太多的线程浮动,它肯定不会启动我的小图表创建一个新的线程。当我在我的Raspis taskmanager上跟踪CPU使用情况时,我注意到了这一点,当时我只看到大约25%的CPU使用率。现在覆盆子皮有4个果仁。。。去算算吧。首先,我在我的Raspi上运行web2py之外的脚本,瞧,整个过程包括csv读取和图表渲染只需要20秒。从那时起(受此启发),这是小菜一碟:使用文档记录良好的子流程使用此脚本调用新的python并完成。所以,感谢所有思考过这个问题的人。

我对这个问题有了一个想法,但我不知道该怎么做。这个想法是,考虑到这样一个事实,我想要一个固定大小的轴(1cm==60s),只需渲染这些片段并在前面提到的时间间隔内将它们一个接一个地粘在一起应该没有问题。从而延长渲染时间。当从串行端口读取数据时,程序大部分时间都在等待(至少85%的空闲时间),它可以利用这段时间做其他事情。