0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Memray工具简介及安装与使用方法

Linux爱好者 来源:开源前哨 作者:南风草木香 2022-06-15 13:17 次阅读

【导语】:Memray是一个可以检查Python代码内存分配情况的工具,我们可以使用它对Python解释器或扩展模块中的代码进行分析,并生成多种统计报告,从而更直观的看到代码的内存分配。

简介

开发者可以根据需要,生成多种统计报告,观察程序的内存分配。

  1. 总结报告

该报告会把多个线程的内存分配情况显示到同一个表格中,own memory表示每个函数占用的内存,total memory表示函数本身及其调用其他函数所占用的内存总量,allocation count表示暂时未释放的内存个数。

0e9c0638-ec69-11ec-ba43-dac502259ad0.png

总结报告
  1. 火焰图报告
该报告可以将内存分配数据可视化展示。火焰图的第一层是占用内存的函数, 宽度越大,则占用的内存越多;每一层的函数都被其下一层的函数所调用,依次类推。
  • 示例代码:
defa(n):
returnb(n)

defb(n):
return[c(n),d(n)]

defc(n):
return"a"*n

defd(n):
return"a"*n

a(100000)
  • 生成的火焰图

0eb53ca2-ec69-11ec-ba43-dac502259ad0.png

火焰图报告

由该图可以看出,函数a调用了函数b,函数b调用了函数c和函数d。且第一层函数c和函数d所占的宽度相同,表示c和d占用的内存一样。

  1. 表格报告

该报告以表格的形式展示程序的内存使用情况。Thread ID表示对应的线程,Size表示占用的内存总数,Allocator表示占用内存的函数,Location表示函数所在的位置。同时,还可以对每一列的数据进行排序。

0ec06370-ec69-11ec-ba43-dac502259ad0.png

表格报告
  1. 树形报告

该报告可以清晰的显示出程序的调用层次。树形报告中根节点中的内存总量和所占百分比只是针对于图中展示的数据,占用内存小的不在图中。

0ed2f436-ec69-11ec-ba43-dac502259ad0.png

树形报告
  1. 统计报告

该报告可以显示程序内存使用情况的详细信息,包括分配的内存总量、分配类型(例如MALLOC, CALLOC)等。

0ee43368-ec69-11ec-ba43-dac502259ad0.png

统计报告

项目地址

https://github.com/bloomberg/memray

安装

目前只能在Linux平台上使用Memray。由于Memray使用了C语言,发布的版本是二进制的,所以得先在系统上安装二进制编译工具。随后在Python3.7+的环境下安装Memray:

python3-mpipinstallmemray

如果你想安装开发版本的Memray,首先要在系统上安装二进制工具:libunwind 和liblz4,随后克隆项目并运行如下命令进行安装:

gitclonegit@github.com:bloomberg/memray.gitmemray
cdmemray
python3-mvenv../memray-env/#justanexample,putthiswhereveryouwant
source../memray-env/bin/activate
python3-mpipinstall--upgradepip
python3-mpipinstall-e.-rrequirements-test.txt-rrequirements-extra.txt

使用

  1. 基本使用

我们可以通过以下命令来追踪python代码的内存分配情况,my_script.py就是要分析的文件:

python3-mmemrayrunmy_script.py

也可以把memray当作命令行工具使用,例如:

memrayrunmy_script.py
memrayrun-mmy_module

以上命令会输出一个二进制文件,随后我们可以根据需要生成统计报告。假如我们想生成一个总结报告,那么可以运行如下命令:

memraysummarymy_script.bin

会生成程序内存分配的总结报告:

0e9c0638-ec69-11ec-ba43-dac502259ad0.png

总结报告

不同的报告形式在简介部分都有展示,请读者自行查看。

  1. 分析C/C++代码的内存分配

当要使用Memray分析numpy或者pandas这种包含C代码的模块时,我们可以运行如下命令:

memrayrun--nativemy_script.py

从而直观的看到Python代码分配了多少内存,扩展模块分配了多少内存。

假如我们在一个文件中使用了Numpy,当我们不使用--native时,生成的统计报告如下图:

0f09c3a8-ec69-11ec-ba43-dac502259ad0.png

统计报告

从图中可以看出在计算Numpy数组时分配了内存,但不清楚是Numpy还是Python解释器分配了内存。通过使用--native命令,就可以得到一个更全面的报告,如图所示:

0f1eed32-ec69-11ec-ba43-dac502259ad0.png

native报告

从图中可以看到Numpy中C模块的调用情况,当添加Numpy数组后,产生了内存分配。我们可以通过文件的后缀名区分Python模块和C模块。

  1. 在代码运行时查看内存分配变化

Memray还支持动态查看Python代码的内存分配情况,我们只需使用以下命令:

memrayrun--livemy_script.py

在这种模式下,开发者可以调试运行时间较长的代码。下图即为文件运行时的内存分配情况:

0f2c8e74-ec69-11ec-ba43-dac502259ad0.gif

Live模式
  1. 结果排序

统计报告中的结果通常是根据分配的总内存,从大到小依次排列。我们可以改变排序条件:

  • t (默认): 根据总内存排列
  • o: 根据每个函数占用的内存排列
  • a: 根据未释放的内存个数进行排列
  1. 查看其他线程

使用live命令默认展示的是主线程的内存分配情况,我们可以通过左右箭头切换到其他线程。

0f530bda-ec69-11ec-ba43-dac502259ad0.png

其他线程
  1. API

除了使用memray run查看Python代码的内存分配,还可以在Python程序中使用memray。

importmemray

withmemray.Tracker("output_file.bin"):
print("Allocationswillbetrackeduntilthewithblockends")

更多细节可以查看相关API文档[1]

后记

在我们平时编写 Python 代码的过程中,有时候只考虑到了业务功能的实现,而忽视了代码的合理性与规范性,例如内存分配就是一个很重要的点,合理的内存分配有助于提升项目的运行速度。Memray 就是一个支持查看Python代码内存分配的工具,它的便捷之处在于:我们可以根据需要,生成多种分析报告,从而直观的了解到自己代码的内存分配情况,避免发生内存泄露现象。

你写 Python 代码时关注过内存使用情况吗?欢迎到评论中分享~

原文标题:8.5K Star! 检查 Python 代码内存分配的利器

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10981

    浏览量

    206687
  • 代码
    +关注

    关注

    30

    文章

    4553

    浏览量

    66665
  • python
    +关注

    关注

    51

    文章

    4667

    浏览量

    83443
  • 内存分配
    +关注

    关注

    0

    文章

    16

    浏览量

    8265

原文标题:8.5K Star! 检查 Python 代码内存分配的利器

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Crawler:关于爬虫的简介安装使用方法之详细攻略

    Crawler:关于爬虫的简介安装使用方法之详细攻略
    发表于 12-19 16:58

    Py之prettytable:prettytable的简介安装使用方法之详细攻略

    Py之prettytable:prettytable的简介安装使用方法之详细攻略
    发表于 12-19 17:00

    Py之cython:python库之cython的简介安装使用方法之详细攻略

    Py之cython:python库之cython的简介安装使用方法之详细攻略
    发表于 12-19 17:05

    Py之neurolab:Python库之neurolab的简介安装使用方法之详细攻略

    Py之neurolab:Python库之neurolab的简介安装使用方法之详细攻略
    发表于 12-20 10:36

    Py之pyserial:Python的pyserial库的简介安装使用方法之详细攻略

    Py之pyserial:Python的pyserial库的简介安装使用方法之详细攻略
    发表于 12-20 10:40

    Crawler之Scrapy:Scrapy简介安装使用方法之详细攻略

    Crawler之Scrapy:Scrapy简介安装使用方法之详细攻略
    发表于 12-21 10:43

    关于Anaconda简介安装使用方法的详细攻略

    DL之Anaconda:关于Anaconda简介安装使用方法的详细攻略
    发表于 12-24 11:42

    常见的图片标注工具labelImg的简介安装使用方法

    labelImg:图片标注工具之labelImg的简介安装使用方法详细攻略
    发表于 12-25 10:26

    Python库的twisted简介安装使用方法

    Py之twisted:Python库之twisted简介安装使用方法等详细攻略
    发表于 12-25 10:03

    Python库的PyMySQL简介安装使用方法

    Py之PyMySQL:Python库之PyMySQL的简介安装使用方法之详细攻略
    发表于 12-26 10:40

    Python库的Shutil简介安装使用方法

    Py之Shutil:Python库之Shutil简介安装使用方法之详细攻略
    发表于 12-27 16:46

    Python库的Xlrd简介安装使用方法

    Py之Xlrd:Python库之Xlrd简介安装使用方法之详细攻略
    发表于 12-27 16:46

    Python库的ipykernel简介安装使用方法

    Py之ipykernel:Python库之ipykernel简介安装使用方法之详细攻略
    发表于 12-27 16:47

    python库之basemap安装使用方法

    Py之basemap:python库之basemap的简介安装使用方法之详细攻略
    发表于 12-28 10:24

    lightgbm的简介安装使用方法

    Py之lightgbm:lightgbm的简介安装使用方法之详细攻略
    发表于 06-01 08:42