gpt4 book ai didi

python - 需要帮助解决 Raspberry Pi 上 matplotlib 的性能问题

转载 作者:太空宇宙 更新时间:2023-11-03 16:53:42 27 4
gpt4 key购买 nike

首先,对于这篇冗长的文字表示歉意。我是 python 和 matplotlib 的新手,所以请耐心等待。

作为 question 的后续行动我发现在 Raspberry Pi 上使用 web2py 生成网格的方法非常耗时。我有一个 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 后端。我选择每次获取数据时将数据写入图表,并在传输完成后保存图表。我以为这应该可以正常工作,但事实并非如此。我不断收到可笑的错误:

RuntimeError: RRuleLocator estimated to generate 9178327 ticks from 0001-01-01 15:20:31.883239+00:00 to 0001-04-17 20:52:39.779205+00:00: exceeds Locator.MAXTICKS * 2 (6000000)

相信我,每次测试运行时我都会不断增加这些 maxticks,以达到错误消息所示的数字。这很荒谬,因为该消息仅包含 60 秒的数据,而我想要访问接近 24 小时的数据。我要么希望 RRuleLocator 停止估计,要么只是闭嘴等待数据结束。我真的不认为我可以从中制作出 MCVE,但我可以找出我最有可能搞砸的细节。

首先,我设置了一些类,所以没有全局变量。为了简化,我有一个通信类,它以一秒的间隔读取串行端口。运行良好,直到昨天将串行端口上输入的所有内容写入 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 的运行非常严格。这意味着没有那么多线程 float ,并且它肯定不会为我的小图表创建启动新线程。当我在 Raspis 任务管理器上跟踪 CPU 使用情况时,我注意到了这一点,但只看到了 25% 左右的情况。现在 Raspberry Pi 有 4 个内核...去算一下吧。首先,我在 Raspi 上的 web2py 之外运行我的脚本,你瞧,包括 csv 读取和图表渲染在内的整个过程只需要 20 秒。从那时起(受到 How to run a task outside web2py and retrieve the output 的启发),这就是小菜一碟:使用记录良好的子进程通过此脚本调用新的 python 并完成。因此,感谢任何对此进行思考的人。

关于python - 需要帮助解决 Raspberry Pi 上 matplotlib 的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35629471/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com