技术背景

当我们需要对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. 组合式api-ref引用子组件、dom元素, defineExpose的使用

    和vue2一样,我们有时候希望父组件能够调用子组件中的方法.属性.那么就要用到ref. 然后你会发现,根本调用不了子组件中的方法"sonSayHi",如下图: 原因: 使用

  2. java后端工具类之从0到1生成数字证书(RSA)

    开放签电子签章系统-开源版这周(2023-12-15)就要上线发布了,为了让开源版能够更好的服务广大研发工程师,接下来会详细的说说开源版从代码层面的具体实现,以便大家在工作过程中更好使用开放签电子签章 ...

  3. VisionPro学习笔记(6)——如何使用QuickBuild

    如果需要了解其他图像处理的文章,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice ...

  4. SQL Server 附加数据库,报只读文件,无权修改其中某些文件

    MSSQL 默认安装在 C盘下,由于C盘没空间了,迁到D盘,这时候在附件数据库是报了错误:附加数据库  因为它是只读的,它具有只读文件,无权修改其中某些文件 如果是可以附加,显示(只读)这时候不能删除 ...

  5. Exception in thread "main" java.lang.UnsatisfiedLinkError: xxx()V

    Exception in thread "main" java.lang.UnsatisfiedLinkError: com.vipsoft.demo.JNIDemo.testHe ...

  6. Python中字符前添加r,b,u,f前缀的含义

    1.在python字符串前添加r,意思为消除转义字符 2.在python字符串前添加f,意思为支持大括号内的python 表达式. 3.在python字符串前添加b,意思为字符串类型为byte类型,在 ...

  7. Bug生命周期

    新建,确认,解决,重新验证,关闭,重新打开 一个Bug由测试人员发现并提交,我们将状态标注为新建:开发人员接收了该Bug,将Bug的状态修改为已分配,表示已经认可:开发人员解决了该bug后,就将bug ...

  8. Java 使用 slf4j + log4j 写日志

    没有SpringBoot等框架的情况下 pom.xml: <properties> <slf4j.version>1.7.26</slf4j.version> &l ...

  9. 密集计算场景下的 JNI 实战

    作者:vivo 互联网服务器团队- Wei Qianzi.Li Haoxuan 在 Java 发展历程中,JNI 一直都是一个不可或缺的角色,但是在实际的项目开发中,JNI 这项技术应用的很少.在笔者 ...

  10. vivo 应用商店推荐系统探索与实践

    介绍 vivo 应用商店推荐系统如何高效支撑个性化的推荐需求. 一.前言 商店的应用数据主要来源于运营排期.CPD.游戏.算法等渠道,成立推荐项目之后也没有变化,发生变化的是由推荐系统负责和数据源进行 ...