Python-tracemalloc-跟踪内存分配

45 篇文章 0 订阅

tracemalloc 模块是一个用于对 python 已申请的内存块进行debug的工具。它能提供以下信息:

  • 定位对象分配内存的位置

  • 文件、按行统计python的内存块分配情况: 总大小、块的数量以及块平均大小。

  • 对比两个内存快照的差异,以便排查内存泄漏

显示前10项

显示内存分配最多的10个文件:

import tracemalloc

tracemalloc.start()
# --- 业务代码 start ---
n = 10000000
s = 0
for i in range(1, n):
    s *= i
# --- 业务代码 end ---
snapshot = tracemalloc.take_snapshot()  # 内存摄像
top_stats = snapshot.statistics('lineno')  # 内存占用数据获取

print('[Top 10]')
for stat in top_stats[:10]:  # 打印占用内存最大的10个子进程
    print(stat)

# [Top 10]
# D:/MyPython/tracemalloc/demo.py:5: size=576 B, count=1, average=576 B
# D:/MyPython/tracemalloc/demo.py:7: size=28 B, count=1, average=28 B

 TOP1:代码第五行占用内存大小576B

 计算差异

获取两个快照并显示差异:

import tracemalloc


tracemalloc.start()
snapshot0 = tracemalloc.take_snapshot()  # 第一张快照
# --- 业务代码 start ---
n = 10000000
s = 0
for i in range(1, n):
    s *= i
# --- 业务代码 end ---
snapshot1 = tracemalloc.take_snapshot()  # 第二张快照
top_stats = snapshot1.compare_to(snapshot0, 'lineno')  # 快照对比

print('[Top 10 differences]')
for stat in top_stats[:10]:
    print(stat)

# [Top 10 differences]
# D:/MyPython/tracemalloc/demo.py:27: size=576 B (+576 B), count=1 (+1), average=576 B
# D:\Program Files\anaconda3\lib\tracemalloc.py:397: size=88 B (+88 B), count=2 (+2), average=44 B
# D:\Program Files\anaconda3\lib\tracemalloc.py:534: size=48 B (+48 B), count=1 (+1), average=48 B
# D:\Program Files\anaconda3\lib\tracemalloc.py:291: size=40 B (+40 B), count=1 (+1), average=40 B
# D:/MyPython/tracemalloc/demo.py:31: size=28 B (+28 B), count=1 (+1), average=28 B

 TOP1:代码第27行占用内存大小增加了576B


参考: 

tracemalloc --- 跟踪内存分配 — Python 3.7.13 文档
https://docs.python.org/zh-cn/3.7/library/tracemalloc.html#module-tracemalloc

python3使用tracemalloc追踪mmap内存变化 - DECHIN - 博客园
https://www.cnblogs.com/dechinphy/p/mmap.html

使用 `tracemalloc` 模块可以跟踪 Python 程序的内存分配情况,从而帮助定位内存泄漏问题。以下是使用 `tracemalloc` 模块的基本步骤: 1. 导入 `tracemalloc` 模块: ```python import tracemalloc ``` 2. 开始跟踪内存分配情况: ```python tracemalloc.start() ``` 3. 执行需要跟踪的代码逻辑。 4. 获取跟踪结果: ```python snapshot = tracemalloc.take_snapshot() ``` 5. 分析跟踪结果: ```python top_stats = snapshot.statistics('lineno') print("[ Top 10 ]") for stat in top_stats[:10]: print(stat) ``` 完整示例代码: ```python import tracemalloc # 开始跟踪内存分配情况 tracemalloc.start() # 执行需要跟踪的代码逻辑 lst = [i for i in range(100000)] # 获取跟踪结果 snapshot = tracemalloc.take_snapshot() # 分析跟踪结果 top_stats = snapshot.statistics('lineno') print("[ Top 10 ]") for stat in top_stats[:10]: print(stat) ``` 输出结果类似于: ``` [ Top 10 ] /home/user/test.py:4: size=462 KiB, count=100001, average=4 B /usr/lib/python3.6/random.py:174: size=6.0 KiB, count=97, average=64 B /usr/lib/python3.6/linecache.py:137: size=3.9 KiB, count=65, average=62 B /usr/lib/python3.6/linecache.py:29: size=3.9 KiB, count=65, average=62 B /usr/lib/python3.6/ast.py:23: size=3.8 KiB, count=101, average=38 B /usr/lib/python3.6/ast.py:384: size=2.7 KiB, count=34, average=80 B /usr/lib/python3.6/site-packages/numpy/lib/type_check.py:341: size=1.5 KiB, count=5, average=312 B /usr/lib/python3.6/site-packages/numpy/core/_methods.py:28: size=1.3 KiB, count=2, average=664 B /usr/lib/python3.6/ast.py:386: size=1.2 KiB, count=17, average=72 B /usr/lib/python3.6/tokenize.py:195: size=1.2 KiB, count=3, average=424 B ``` 通过分析跟踪结果,可以定位到代码中的内存分配情况,并进一步判断是否存在内存泄漏问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值