一篇文章教小白会Python 绘制Android CPU和内存增长曲线_python3 绘制各个进程的内存曲线

脚本传入的参数有两个,一个是监控的JSON数据字符串值sys.argv[1],一个是保存的图片文件完整路径sys.argv[2]。关于传入的JSON参数字符串值需要加上单引号修饰,否则会导致解析异常,传入的JSON参数也不能直接是JSON对象,必须转化成字符串,示例调用命令如下:

python dump_chart.py  '<JSONString>'  cpu_chart.png 

1、采样CPU示例数据,time是设备的系统时间戳,CPU的占用率的计算可以查看后面具题写的:Android 性能监控之CPU监控。

[
 {
 "time": "1589435564442.279053",
 "cpuRate": "2.17"
 },
 {
 "time": "1589435565655.333008",
 "cpuRate": "3.26"
 },
 {
 "time": "1589435566954.137939",
 "cpuRate": "2.52"
 },
 ...
]

2、采样内存示例数据,totalPss、nativePss和dalvikPss值都是从dumpsys meminfo输出的应用内存信息中截取出来的原始数据,对应“TOTAL”、“Native Heap“、”Dalvik Heap“字段的Pss Total值。

[
 {
 "time": "1589636256923.429932",
 "totalPss": 177804,
 "nativePss": 27922,
 "dalvikPss": 10212
 },
 {
 "time": "1589636258236.298096",
 "totalPss": 178021,
 "nativePss": 27850,
 "dalvikPss": 9990
 },
 {
 "time": "1589636259525.219971",
 "totalPss": 177899,
 "nativePss": 27742,
 "dalvikPss": 9990
 },
 ...
]

😉3.1、实现过程中遇到的问题

1、load方法使用错误

json.load()方法使用错误,应该替换成json.loads()。

exeption occur:Traceback (most recent call last):
  File "\*\*\*\*\*\*\*", line 11, in startDump
    memoryData = json.load(sys.argv[1])
  File "/usr/local/Cellar/python@2/2.7.15\_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/\_\_init\_\_.py", line 287, in load
    return loads(fp.read(),
AttributeError: 'str' object has no attribute 'read'

2、 JSON字符串对象入参问题

File "\*\*\*\*\*\*", line 11, in startDump
    memoryData = json.loads(sys.argv[1])
  File "/usr/local/Cellar/python@2/2.7.15\_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/\_\_init\_\_.py", line 339, in loads
    return _default_decoder.decode(s)
  File "/usr/local/Cellar/python@2/2.7.15\_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/Cellar/python@2/2.7.15\_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

针对Python脚本调用,JSON字符串对象作为入参,传入的JSON字符串对象需要加单引号处理,比如在JavaScript中示例处理如下:

 '\'' + JSON.stringify(cpuRateJSON) + '\''

3.3、Python需要显示声明参数的类型

在Python中需要指明参数的类型,解析获取到JSON对象中的值之后,Python并不会根据参数来判断是什么类型,需要指明要转化的对象参数类型,比如把系统时间戳转化成float值类型:float(memoryData[0][“time”])

Traceback (most recent call last):
  File "\*\*\*\*\*\*\*", line 21, in startDump
    timeArray.append(timeStamp(memoryItem["time"]))
  File "\*\*\*\*\*\*\*", line 36, in timeStamp
    timeStamp = float(timeNum/1000)
TypeError: unsupported operand type(s) for /: 'unicode' and 'int'

🏳️‍🌈4、编码导致的异常

SyntaxError: Non-ASCII character '\xe5' in file \*\*\*\*\*\*\* on line 24, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

如果运行之后报如下的异常,说明是编码出问题,在脚本开头加上编码类型声明:

#!usr/bin/python
# -\*- coding: utf-8 -\*-

🏳️‍🌈5、保存的文件格式限制

plt.savefig(image_path) 保存的文件格式只能是eps, pdf, pgf, png, ps, raw, rgba, svg, svgz这些,不支持jpg图片的保存。

Traceback (most recent call last):
  File "/Users/chenwenguan/Documents/AmapAuto/Project/arc-resources/script/performanceMonitor/dump\_cpu\_chart\_image.py", line 23, in startDump
    plt.savefig(image_path)
  File "/usr/local/lib/python2.7/site-packages/matplotlib/pyplot.py", line 695, in savefig
    res = fig.savefig(\*args, \*\*kwargs)
  File "/usr/local/lib/python2.7/site-packages/matplotlib/figure.py", line 2062, in savefig
    self.canvas.print\_figure(fname, \*\*kwargs)
  File "/usr/local/lib/python2.7/site-packages/matplotlib/backend\_bases.py", line 2173, in print_figure
    canvas = self.\_get\_output\_canvas(format)
  File "/usr/local/lib/python2.7/site-packages/matplotlib/backend\_bases.py", line 2105, in _get_output_canvas
    .format(fmt, ", ".join(sorted(self.get\_supported\_filetypes()))))
ValueError: Format 'jpg' is not supported (supported formats: eps, pdf, pgf, png, ps, raw, rgba, svg, svgz)

🏳️‍🌈6、python-tk 依赖

Traceback (most recent call last):
  File "\*\*\*\*\*\*\*", line 2, in <module>
    import matplotlib.pyplot as plt
  File "/home/arc/.local/lib/python2.7/site-packages/matplotlib/pyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab\_setup()
  File "/home/arc/.local/lib/python2.7/site-packages/matplotlib/backends/\_\_init\_\_.py", line 63, in pylab_setup
    [backend_name], 0)
  File "/home/arc/.local/lib/python2.7/site-packages/matplotlib/backends/backend\_tkagg.py", line 4, in <module>
    from . import tkagg  # Paint image to Tk photo blitter extension.
  File "/home/arc/.local/lib/python2.7/site-packages/matplotlib/backends/tkagg.py", line 5, in <module>
    from six.moves import tkinter as Tk
  File "/home/arc/.local/lib/python2.7/site-packages/six.py", line 203, in load_module
    mod = mod.\_resolve()
  File "/home/arc/.local/lib/python2.7/site-packages/six.py", line 115, in _resolve
    return \_import\_module(self.mod)
  File "/home/arc/.local/lib/python2.7/site-packages/six.py", line 82, in _import_module
    \_\_import\_\_(name)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 42, in <module>
    raise ImportError, str(msg) + ', please install the python-tk package'

缺少python-tk依赖,执行一下命令安装:

sudo apt-get install -y python-tk

🏳️‍🌈7、 Agg画布初始化配置

Traceback (most recent call last):
  File "\*\*\*\*\*\*", line 22, in startDump
    plt.title("ARC Monitor Memory")
  File "/home/arc/.local/lib/python2.7/site-packages/matplotlib/pyplot.py", line 1419, in title
    return gca().set\_title(s, \*args, \*\*kwargs)
  File "/home/arc/.local/lib/python2.7/site-packages/matplotlib/pyplot.py", line 969, in gca
    return gcf().gca(\*\*kwargs)
  File "/home/arc/.local/lib/python2.7/site-packages/matplotlib/pyplot.py", line 586, in gcf
    return figure()
  File "/home/arc/.local/lib/python2.7/site-packages/matplotlib/pyplot.py", line 533, in figure
    \*\*kwargs)
  File "/home/arc/.local/lib/python2.7/site-packages/matplotlib/backend\_bases.py", line 161, in new_figure_manager
    return cls.new\_figure\_manager\_given\_figure(num, fig)
  File "/home/arc/.local/lib/python2.7/site-packages/matplotlib/backends/\_backend\_tk.py", line 1046, in new_figure_manager_given_figure
    window = Tk.Tk(className="matplotlib")
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1828, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
TclError: no display name and no $DISPLAY environment variable

在Mac上运行的时候不会出现这个问题,但在Ubuntu环境下运行的时候就报异常了,官网的解释如下:

When using Matplotlib versions older than 3.1, it is necessary to explicitly instantiate an Agg canvas

在脚本文件开头显示声明Agg使用:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

🏳️‍🌈8、pyecharts 版本配置问题

如果不是用Python原生方式绘图,而是用pyecharts来绘制图表,要注意下Python版本的匹配。pyecharts v1.0.0 停止对 Python2.7,3.4~3.5 版本的支持和维护,仅支持 Python3.6+。

Traceback (most recent call last):
  File "\*\*\*\*\*\*\*", line 11, in <module>
    from pyecharts import options as opts
  File "/usr/local/lib/python2.7/site-packages/pyecharts/\_\_init\_\_.py", line 1, in <module>
    from pyecharts import charts, commons, components, datasets, options, render, scaffold
  File "/usr/local/lib/python2.7/site-packages/pyecharts/charts/\_\_init\_\_.py", line 2, in <module>
    from ..charts.basic_charts.bar import Bar
  File "/usr/local/lib/python2.7/site-packages/pyecharts/charts/basic\_charts/bar.py", line 17
    series_name: str,
               ^
SyntaxError: invalid syntax

🏳️‍🌈9、图像显示不全问题

测试过程中发现依次保存CPU和内存数据,可能会出现其中一张图片显示有缺失,只显示一半图像内容。在matplotlib中,轴Axes的位置以标准化图形坐标指定,可能发生的情况是轴标签、标题、刻度标签等等会超出图形区域,导致显示不全。后面加上tight_layout自适应调用之后问题修复。tight_layout会自动调整子图参数,使之填充整个图像区域。

plt.tight\_layout()

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要监视Ray的各个任务的进度以及CPU的占用率并绘制曲线图,需要使用Python中的一些库和工具。 首先,你可以使用Ray的Dashboard来监视Ray的任务。Ray Dashboard是一个Web界面,可以显示Ray集群中的任务、资源使用情况等信息。你可以在启动Ray时打开Dashboard,如下所示: ```python import ray ray.init(dashboard_host='0.0.0.0') ``` 这将启动一个Ray Dashboard,你可以通过在浏览器中输入`http://localhost:8265`来访问。 其次,你可以使用psutil库来监视CPU的占用率。psutil是一个跨平台的库,可以用来获取系统信息,包括CPU内存、磁盘、网络等信息。 下面是一个使用psutil来获取CPU占用率的示例: ```python import psutil import time while True: cpu_percent = psutil.cpu_percent() print(f"CPU usage: {cpu_percent}%") time.sleep(1) ``` 最后,你可以使用matplotlib库来绘制曲线图。matplotlib是一个Python的绘图库,可以用来绘制各种类型的图表,包括折线图、散点图、柱状图等。 下面是一个使用matplotlib来绘制曲线图的示例: ```python import psutil import matplotlib.pyplot as plt cpu_percent_list = [] while True: cpu_percent = psutil.cpu_percent() cpu_percent_list.append(cpu_percent) plt.plot(cpu_percent_list) plt.pause(1) ``` 这将绘制一个实时更新的CPU占用率曲线图。 综上所述,你可以结合以上三个工具来监视Ray的任务进度和CPU占用率,并绘制曲线图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值