如何按内存大小排序tracemalloc统计结果,定位高内存占用代码?
如何让tracemalloc的统计结果按内存大小排序?
我用tracemalloc分析内存占用的代码如下:
def print_statistics(s: Snapshot, s2: Snapshot): stats = s2.compare_to(s, 'lineno') for stat in stats[:20]: print(stat) def some_func(): tracemalloc.start(50) s = tracemalloc.take_snapshot() # 业务代码 s2 = tracemalloc.take_snapshot() print_statistics(s, s2)
得到的输出示例:
/usr/local/lib/python3.8/json/decoder.py:353: size=2672 B (+2672 B), count=33 (+33), average=81 B /usr/local/lib/python3.8/site-packages/prometheus_client/values.py:15: size=1664 B (+1664 B), count=32 (+32), average=52 B /usr/local/lib/python3.8/site-packages/prometheus_client/metrics.py:521: size=1304 B (+1304 B), count=17 (+17), average=77 B /usr/local/lib/python3.8/site-packages/prometheus_client/values.py:16: size=1152 B (+1152 B), count=32 (+32), average=36 B /usr/local/lib/python3.8/tracemalloc.py:185: size=13.2 KiB (+5328 B), count=281 (+111), average=48 B /usr/local/lib/python3.8/json/decoder.py:353: size=5344 B (-2672 B), count=66 (-33), average=81 B /usr/local/lib/python3.8/tracemalloc.py:102: size=5891 B (+2366 B), count=37 (+16), average=159 B
我发现输出顺序混乱,没有按规则排序,请问怎么调整才能按内存大小排序统计结果,定位到占用内存最多的代码部分?
解决方法
tracemalloc的compare_to方法返回的统计结果默认排序规则并非按内存增量或总大小,你需要手动对结果进行排序:
1. 按内存增量降序排序
修改print_statistics函数,在遍历前调用stats.sort(),指定排序依据为内存变化量(stat.size_diff),并设置降序,这样内存增加最多的条目会排在最前面:
def print_statistics(s: Snapshot, s2: Snapshot): stats = s2.compare_to(s, 'lineno') # 按内存增量从大到小排序 stats.sort(key=lambda stat: stat.size_diff, reverse=True) for stat in stats[:20]: print(stat)
2. 按总内存大小降序排序
如果需要关注当前快照的总内存占用情况,改用stat.size作为排序key:
def print_statistics(s: Snapshot, s2: Snapshot): stats = s2.compare_to(s, 'lineno') # 按总内存大小从大到小排序 stats.sort(key=lambda stat: stat.size, reverse=True) for stat in stats[:20]: print(stat)
关键参数说明
stat.size_diff:两个快照之间的内存变化量,正数表示内存增加,负数表示内存释放reverse=True:确保大内存占用的条目优先显示,便于快速定位内存热点代码
内容的提问来源于stack exchange,提问作者Ema Il
相关产品推荐
相关产品推荐

