技术背景

当我们需要对python代码所占用的内存进行管理时,首先就需要有一个工具可以对当前的内存占用情况进行一个追踪。虽然在Top界面或者一些异步的工具中也能够看到实时的内存变化,还有一些工具可以统计代码中每一步的内存占用。但如果只是要查看单步操作之后的内存变化,tracemalloc的简单易用,让它成为了一个绝佳的选择。本文主要介绍用tracemalloc来追踪代码的内存占用变化。

tracemalloc的使用

tracemalloc的操作逻辑非常简单,在开始统计时使用一个start函数,结束统计的时候使用一个stop函数,中间过程就像拍照片一样不断的使用get_traced_memory函数即可。

import numpy as np
import tracemalloc a = np.random.random((1000000,))
tracemalloc.start()
current, peak = tracemalloc.get_traced_memory()
print(f"Current memory usage is {current / 10**6}MB; Peak was {peak / 10**6}MB")
b = np.random.random((1000000,))
current, peak = tracemalloc.get_traced_memory()
print(f"Current memory usage is {current / 10**6}MB; Peak was {peak / 10**6}MB")
b = b.astype(np.float32)
current, peak = tracemalloc.get_traced_memory()
print(f"Current memory usage is {current / 10**6}MB; Peak was {peak / 10**6}MB")
del a
current, peak = tracemalloc.get_traced_memory()
print(f"Current memory usage is {current / 10**6}MB; Peak was {peak / 10**6}MB")
del b
current, peak = tracemalloc.get_traced_memory()
print(f"Current memory usage is {current / 10**6}MB; Peak was {peak / 10**6}MB")
tracemalloc.stop()

在上面这个案例中,我们在统计内存占用前也分配了一个numpy数组,但是我们发现这个内存分配被自动忽略了。也就是说,我们只统计start函数开始之后的每一步的操作导致的内存变化。我们在start之后定义了一个numpy数组b,这里还是一个numpy.float64的数组,占用了8MB的内存。在将其转化为numpy.float32的数组之后,内存一下子缩小了一半,为4MB。但是我们发现,此时的峰值内存占用是12MB,也就是说,这个astype的操作,其实相当于定义了一个新的数组,然后把原数组拷贝到新的数组中,再将原数组释放掉这样的一个流程。在测试案例的最后,我们使用python的del删除了这个数组对象,此时内存就被清空了。具体运行结果如下所示:

Current memory usage is 0.0MB; Peak was 0.0MB
Current memory usage is 8.000096MB; Peak was 8.000312MB
Current memory usage is 4.000152MB; Peak was 12.000248MB
Current memory usage is 4.000152MB; Peak was 12.000248MB
Current memory usage is 5.6e-05MB; Peak was 12.000248MB

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/tracemalloc.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

参考链接

  1. https://zhuanlan.zhihu.com/p/151637281

Python追踪内存占用的更多相关文章

  1. Python读取大文件的"坑“与内存占用检测

    python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. 1. ...

  2. python获取系统内存占用信息的实例方法

    psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系统监控, ...

  3. 【python】threadpool的内存占用问题

    先说结论: 在使用多线程时,不要使用threadpool,应该使用threading, 尤其是数据量大的情况.因为threadpool会导致严重的内存占用问题! 对比threading和threadp ...

  4. 【KAWAKO】python查看内存空间占用情况

    目录 查看变量的内存占用 查看运行内存占用 查看变量的内存占用 import sys c = 1145.114 print(sys.getsizeof(c)) 查看运行内存占用 import psut ...

  5. 【python】内存调试

    全文拷贝自:http://blog.csdn.net/BaishanCloud/article/details/76422782 问题定位过程解读 gdb-python:搞清楚python程序在做什么 ...

  6. python的内存分配

    一.前言 大多数编译型语言,变量在使用前必须先声明,其中C语言更加苛刻:变量声明必须位于代码块最开始,且在任何其他语句之前.其他语言,想C++和java,允许“随时随地”声明变量,比如,变量声明可以在 ...

  7. python3使用迭代生成器yield减少内存占用

    技术背景 在python编码中for循环处理任务时,会将所有的待遍历参量加载到内存中.其实这本没有必要,因为这些参量很有可能是一次性使用的,甚至很多场景下这些参量是不需要同时存储在内存中的,这时候就会 ...

  8. android应用内存占用测试(每隔一秒打印procrank的信息)

    1.内存占用 对于智能手机而言,内存大小是固定的:因此,如果单个app的内存占用越小,手机上可以安装运行的app就越多:或者说app的内存占用越小,在手机上运行就会越流畅.所以说,内存占用的大小,也是 ...

  9. python 的内存回收,及深浅Copy详解

    一.python中的变量及引用 1.1 python中的不可变类型: 数字(num).字符串(str).元组(tuple).布尔值(bool<True,False>) 接下来我们讲完后你就 ...

  10. 【python】内存相关

    1.  /proc/pid/status 可以查看进程相关的详细信息,当内存异常时可查看 参考:http://blog.csdn.net/beckdon/article/details/4849190 ...

随机推荐

  1. Bugku CTF web题

    web2 查看网页源码,发现flag

  2. HDU-3591 混合背包

    The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  3. 关于WPF下用户登录后再启动主窗体的实现方法

    /// <summary>App.xaml 的交互逻辑</summary> public partial class App : Application { private b ...

  4. CentOS连接网络设置

    https://blog.csdn.net/tsundere_x/article/details/104263100  用这个 VMware提供了三种将虚拟网卡和物理网卡捆绑起来的方式,即桥接(Bri ...

  5. 【并发编程特性】并发编程特性之五种特性的探讨-volatileandsynchronized

    title: [并发编程特性]并发编程特性之五种特性的探讨 date: 2021-11-18 10:16:05.492 updated: 2021-12-26 17:43:10.414 url: ht ...

  6. java生成企业公章图片源代码

    企业公章图片在电子签章业务中应用广泛,在电子签章应用过程中首先需要生成公章图片,然后再使用公章图片结合数字签名技术完成电子签,这样就实现了从可视化到不可篡改的数字化电子签章功能,以下是企业公章图片生成 ...

  7. 《语义增强可编程知识图谱SPG》白皮书

    语义増强可编程图谱框架:新一代知识图谱语义框架/引擎.SPG+LLM双驱架构及应用相关进展和应用.<语义增强可编程知识图谱SPG>白皮书 v1.0.pdf: https://url39.c ...

  8. 详解GaussDB(DWS)用户监控原理及应用

    摘要:本文将聚焦于用户监控的原理及应用进行介绍. 本文分享自华为云社区<GaussDB(DWS)监控工具指南(二)用户级监控>,作者:幕后小黑爪 . 前言 资源监控是整个运维乃至整个产品生 ...

  9. 科技抗疫,少年可期,为这群有AI的天使开发者疯狂打call

    摘要:2020年初新冠突发,在这场抗疫的战斗中,让我们深刻体会到,疫情与每一个人息息相关.有这样一群来自华中科技大学的师生项目团队,他们利用AI技术,助力全球抗疫,他们是怎么做的呢?让我们一起来看看吧 ...

  10. 带你认识图数据库性能和场景测试利器LDBC SNB

    摘要:本文主要介绍基于交互式查询所用的数据生成器(下文简称Datagen),及LDBC SNB数据如何在华为图引擎服务GES中应用. 本文分享自华为云社区<[图数据库性能和场景测试利器LDBC ...