该报告会把多个线程的内存分配情况显示到同一个表格中, own memory 表示每个函数占用的内存, total memory 表示函数本身及其调用其他函数所占用的内存总量, allocation count 表示暂时未释放的内存个数。
def a(n):
return
b(n)
def b(n):
return
[c(n), d(n)]
def c(n):
return
"a"
* n
def d(n):
return
"a"
* n
a(100000)
生成的火焰图
火焰图报告
由该图可以看出,函数a调用了函数b,函数b调用了函数c和函数d。且第一层函数c 和函数d所占的宽度相同,表示c和d占用的内存一样。
该报告以表格的形式展示程序的内存使用情况。 Thread ID 表示对应的线程, Size 表示占用的内存总数, Allocator 表示占用内存的函数, Location 表示函数所在的位置。同时,还可以对每一列的数据进行排序。
该报告可以清晰的显示出程序的调用层次。树形报告中根节点中的内存总量和所占百分比 只是针对于图中展示的数据,占用内存小的不在图中。
该报告可以显示程序内存使用情况的详细信息,包括分配的内存总量、分配类型(例如 MALLOC, CALLOC )等。
统计报告
项目地址
https://github.com/bloomberg/memray
目前只能在Linux平台上使用Memray。由于Memray使用了C语言,发布的版本 是二进制的,所以得先在系统上安装二进制编译工具。随后在Python3.7+的环境 下安装Memray:
python3 -m pip install memray
如果你想安装开发版本的Memray,首先要在系统上安装二进制工具: libunwind 和liblz4 ,随后克隆项目并运行如下命令进行安装:
git
clone
git@github.com:bloomberg/memray.git memray
cd
memray
python3 -m venv ../memray-env/
# just an example, put this wherever you want
source
../memray-env/bin/activate
python3 -m pip install --upgrade pip
python3 -m pip install -e . -r requirements-test.txt -r requirements-extra.txt
我们可以通过以下命令来追踪python代码的内存分配情况,my_.py就是要分析的文件:
python3 -m memray run my_.py
也可以把memray当作命令行工具使用,例如:
memray run my_.py
memray run -m my_module
以上命令会输出一个二进制文件,随后我们可以根据需要生成统计报告。假如我们想生成一个总结报告,那么可以运行如下命令:
memray summary my_.bin
会生成程序内存分配的总结报告:
不同的报告形式在简介部分都有展示,请读者自行查看。
分析C/C++代码的内存分配
当要使用Memray分析numpy或者pandas这种包含C代码的模块时,我们可以运行如下命令:
memray run --native my_.py
从而直观的看到Python代码分配了多少内存,扩展模块分配了多少内存。
假如我们在一个文件中使用了Numpy,当我们不使用 --native 时,生成的统计报告如下图:
从图中可以看出在计算Numpy数组时分配了内存,但不清楚是Numpy还是Python解释器分配了内存。通过使用 --native 命令,就可以得到一个 更全面的报告,如图所示:
native报告
从图中可以看到Numpy中C模块的调用情况,当添加Numpy数组后,产生了内存分配。我们可以通过文件的后缀名区分Python模块和C模块。
在代码运行时查看内存分配变化
Memray还支持动态查看Python代码的内存分配情况,我们只需使用以下命令:
memray run --live my_.py
在这种模式下,开发者可以调试运行时间较长的代码。下图即为文件运行时的内存分配情况:
Live模式
统计报告中的结果通常是根据分配的总内存,从大到小依次排列。我们可以改变排序条件:
t (默认): 根据总内存排列
o: 根据每个函数占用的内存排列
a: 根据未释放的内存个数进行排列
查看其他线程
使用 live 命令默认展示的是主线程的内存分配情况,我们可以通过左右箭头切换到其他线程。
除了使用 memray run 查看Python代码的内存分配,还可以在Python程序中使用memray。
import memray
with memray.Tracker(
"output_file.bin"
):
print
(
"Allocations will be tracked until the with block ends"
)
更多细节可以查看相关
API文档
[1]
。
在我们平时编写 Python 代码的过程中,有时候只考虑到了业务功能的实现,而忽视了代码的合理性与规范性,例如内存分配就是一个很重要的点,合理的内存分配有助于 提升项目的运行速度。Memray 就是一个支持查看Python代码内存分配的工具,它的便捷之处在于:我们可以根据需要,生成多种分析报告,从而直观的了解到自己代码的内存分配情况,避免发生内存泄露现象。
你写 Python 代码时关注过内存使用情况吗?欢迎到评论中分享~
参考资料:
API文档: https://bloomberg.github.io/memray/api.html
- EOF -
点击标题可跳转
1、 Python 处理超大 JSON 文件,这个方法简单!
2、 实用!一款开源的 JSON 可视化管理工具
3、 1.8 万 Star!这款 Nginx 可视化配置工具太强了!
↓推荐关注↓
「开源前哨」日常分享热门、有趣和实用的开源项目。参与维护10万+star 的开源技术资源库,包括:Python, Java, C/C++, Go, JS, CSS, Node.js, PHP, .NET 等
点赞和在看就是最大的支持❤️
返回搜狐,查看更多
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
发布于:
山西省