Python查看所占内存较大的变量并删除

本文介绍了一个Python脚本,用于检测Jupyter/IPython环境中变量所占用的内存,筛选出占用较大但可能无用的变量,以便进行内存优化和释放。通过`sys.getsizeof`函数实现内存使用情况的实时查看和管理。
import sys
print("{}{: >40}{}{: >10}{}".format('|','Variable Name','|','Memory(M)','|'))
print(" ------------------------------------------------------")
for var_name in dir():
    if not var_name.startswith("_"):
        var_size=sys.getsizeof(eval(var_name))/1024**2
        if var_size>=1: #这里只输出所占内存大于等于1M的变量
            print("{}{: >40}{}{:>10.2f}{}".format('|',var_name,'|',var_size,'|'))

找到所占内存较大但又用处不大的变量后,可以用 del var_name 方法删除以回收内存。

参考:在Jupyter(IPython)上查找和删除需要大量内存的变量 | 码农家园

### 使用 `sys` 模块查看变量内存占用 Python 提供了内置模块 `sys`,其中的 `getsizeof()` 函数可以用于获取变量内存占用的字节数。这个函数可以返回包括基础类型(如整数、字符串)和复杂对象(如列表、字典)在内的内存占用情况。以下是一个示例: ```python import sys a = [1, 2, 3, 4, 5] print(sys.getsizeof(a)) # 输出列表对象本身的内存小 ``` 需要注意的是,`sys.getsizeof()` 仅返回对象本身的小,不包括其所引用的其他对象。例如,对于一个包含多个字符串的列表,`getsizeof()` 不会自动计算这些字符串所占用的额外内存[^1]。 ### 使用 `pympler` 获取更精确的内存信息 如果需要更全面地分析对象及其引用对象的内存使用情况,可以使用第三方库 `pympler`。该库提供了一个 `asizeof` 模块,可以递归地计算对象及其子对象的总内存占用: ```python from pympler import asizeof data = {'key1': [1, 2, 3], 'key2': 'example string'} print(asizeof.asizeof(data)) # 输出包含字典及其所有子对象的总内存小 ``` 这种方法能够更准确地反映复杂数据结构在内存中的实际占用情况[^2]。 ### 使用 `memory_profiler` 监控内存使用 对于需要动态监控整个脚本运行过程中内存变化的场景,可以使用 `memory_profiler` 库。通过装饰器的方式,可以逐行分析代码执行时内存的变化情况: ```python from memory_profiler import profile import numpy as np @profile def test_function(): a = np.arange(10000) # 创建一个较大的数组 del a test_function() ``` 运行此脚本时,需要在命令行中使用 `mprof` 工具进行监控,例如: ```bash mprof run script.py ``` 该工具会输出详细的内存使用曲线,帮助识别内存使用的峰值和潜在的内存泄漏点。 ### 自定义函数遍历当前变量分析内存占用 为了快速查看当前环境中所有变量内存占用情况,可以编写一个脚本,利用 `dir()` 函数获取所有变量名称,结合 `sys.getsizeof()` 进行筛选和输出: ```python import sys def human_readable_size(bytes_size): """将字节小转换为更易读的形式""" for unit in ['B', 'KB', 'MB', 'GB']: if bytes_size < 1024: return f"{bytes_size:.2f}{unit}" bytes_size /= 1024 return f"{bytes_size:.2f}TB" print("{0: >20} {1: >10}".format('Variable', 'Size')) for var_name in dir(): if not var_name.startswith("_"): var = eval(var_name) size = sys.getsizeof(var) print(f"{var_name: >20} {human_readable_size(size)}") ``` 上述代码将输出当前作用域中所有非私有变量(不以 `_` 开头)的名称及其内存占用小,便于快速定位内存占用较大变量[^3]。 ### 删除占用内存较大变量 如果发现某些变量占用内存且不再需要,可以通过 `del` 语句手动删除这些变量以释放内存空间。以下是一个示例,仅输出内存占用于等于1MB的变量: ```python import sys for var_name in dir(): if not var_name.startswith("_"): var_size = sys.getsizeof(eval(var_name)) / (1024 ** 2) if var_size >= 1: print(f"Deleting {var_name} which occupies {var_size:.2f} MB") del eval(var_name)[] ``` 通过这种方式,可以有效地管理程序运行时的内存使用,避免因内存不足而导致的性能下降或程序崩溃[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值