Python如何监控并获取内存使用情况

 更新时间:2026年03月29日 09:23:29   作者:detayun  
在Python开发中,监控内存使用情况对于性能优化和问题排查至关重要,本文将介绍多种获取内存使用情况的方法,大家可以根据自己的需要进行选择

在Python开发中,监控内存使用情况对于性能优化、资源管理和问题排查至关重要。本文将介绍多种获取内存使用情况的方法,涵盖操作系统级监控、Python对象内存分析以及第三方工具的使用。

一、为什么需要监控内存使用

  • 性能优化:识别内存泄漏或过度内存消耗
  • 资源管理:在容器化环境中控制资源使用
  • 问题排查:分析内存异常增长的原因
  • 容量规划:为系统扩展提供数据支持

二、操作系统级内存监控

方法1:使用psutil库(跨平台推荐)

psutil是一个跨平台库,可以轻松获取系统内存信息:

import psutil

def get_system_memory_info():
    """获取系统内存使用情况"""
    mem = psutil.virtual_memory()
    swap = psutil.swap_memory()
    
    print("=== 系统内存信息 ===")
    print(f"总内存: {mem.total / (1024**3):.2f} GB")
    print(f"可用内存: {mem.available / (1024**3):.2f} GB")
    print(f"已用内存: {mem.used / (1024**3):.2f} GB")
    print(f"内存使用率: {mem.percent}%")
    print("\n=== 交换分区信息 ===")
    print(f"总交换空间: {swap.total / (1024**3):.2f} GB")
    print(f"已用交换空间: {swap.used / (1024**3):.2f} GB")
    print(f"交换空间使用率: {swap.percent}%")

# 使用示例
get_system_memory_info()

方法2:读取/proc/meminfo(Linux专用)

在Linux系统中,可以直接读取/proc/meminfo文件:

def get_linux_memory_info():
    """Linux系统内存信息(通过/proc/meminfo)"""
    try:
        with open('/proc/meminfo', 'r') as f:
            mem_info = {}
            for line in f:
                parts = line.split(':')
                if len(parts) == 2:
                    key = parts[0].strip()
                    value = int(parts[1].split()[0])  # 取第一个数值
                    mem_info[key] = value
            
        # 转换为GB单位
        total = mem_info['MemTotal'] / (1024**2)
        available = mem_info['MemAvailable'] / (1024**2) if 'MemAvailable' in mem_info else 0
        used = total - available
        
        print("=== Linux内存信息 ===")
        print(f"总内存: {total:.2f} GB")
        print(f"可用内存: {available:.2f} GB")
        print(f"已用内存: {used:.2f} GB")
        print(f"内存使用率: {(used/total)*100:.1f}%")
    except FileNotFoundError:
        print("无法读取/proc/meminfo(非Linux系统)")

# 使用示例
get_linux_memory_info()

方法3:使用resource模块(Unix系统)

Python内置的resource模块可以获取当前进程的内存使用:

import resource

def get_process_memory_unix():
    """获取当前进程的内存使用(Unix系统)"""
    try:
        # 获取最大驻留集大小(RSS)
        rss = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
        
        # 单位转换(不同系统单位不同)
        if hasattr(resource, 'getpagesize'):
            page_size = resource.getpagesize()
            rss_gb = rss * page_size / (1024**3)
        else:
            # 假设单位是KB(常见于Linux)
            rss_gb = rss / (1024**2)
            
        print(f"当前进程内存使用: {rss_gb:.2f} GB")
    except AttributeError:
        print("resource模块功能在当前系统不可用")

# 使用示例
get_process_memory_unix()

三、Python对象内存分析

方法1:使用sys.getsizeof()

获取单个Python对象的大小(注意:不包含对象引用的其他对象):

import sys

def object_memory_example():
    """演示sys.getsizeof()的使用"""
    print("基本类型内存占用:")
    print(f"int: {sys.getsizeof(42)} bytes")
    print(f"float: {sys.getsizeof(3.14)} bytes")
    print(f"str: {sys.getsizeof('hello')} bytes")
    print(f"list: {sys.getsizeof([1, 2, 3])} bytes")
    print(f"dict: {sys.getsizeof({'a': 1})} bytes")

# 使用示例
object_memory_example()

方法2:使用pympler库(深度分析)

pympler提供了更全面的内存分析工具:

from pympler import asizeof, summary, muppy

def deep_memory_analysis():
    """深度内存分析示例"""
    # 创建一些测试对象
    test_data = {
        'list': [i for i in range(1000)],
        'dict': {i: str(i) for i in range(1000)},
        'set': set(range(1000)),
        'str': 'a' * 10000
    }
    
    # 获取单个对象大小
    print(f"列表大小: {asizeof.asizeof(test_data['list'])/1024:.2f} KB")
    
    # 获取所有对象的汇总信息
    all_objects = muppy.get_objects()
    sum_obj = summary.summarize(all_objects)
    summary.print_(sum_obj)
    
    # 获取特定类型对象的汇总
    from pympler.class_tracker import ClassTracker
    tracker = ClassTracker()
    tracker.track_object(test_data)
    tracker.create_snapshot()
    tracker.stats.print_()

# 使用示例(注释掉以避免输出过长)
# deep_memory_analysis()

方法3:跟踪内存变化

import tracemalloc

def track_memory_usage():
    """跟踪内存分配变化"""
    tracemalloc.start()
    
    # 第一次快照
    snapshot1 = tracemalloc.take_snapshot()
    
    # 执行一些内存分配操作
    data = [i for i in range(100000)]
    
    # 第二次快照
    snapshot2 = tracemalloc.take_snapshot()
    
    # 比较两个快照
    top_stats = snapshot2.compare_to(snapshot1, 'lineno')
    
    print("[ Top 10 memory growth ]")
    for stat in top_stats[:10]:
        print(stat)
    
    tracemalloc.stop()

# 使用示例
track_memory_usage()

四、实时监控内存使用

方法1:使用memory_profiler

# 需要先安装: pip install memory_profiler
from memory_profiler import memory_usage
import time

def my_function():
    """测试函数内存使用"""
    data = [i for i in range(100000)]
    time.sleep(1)
    return sum(data)

# 监控函数内存使用
mem_usage = memory_usage((my_function, (), {}), interval=0.1)
print(f"最大内存使用: {max(mem_usage):.2f} MB")

方法2:装饰器方式监控

from memory_profiler import profile

@profile
def memory_intensive_function():
    """使用装饰器监控内存"""
    a = [1] * (10 ** 6)
    b = [2] * (2 * 10 ** 7)
    del b
    return a

# 使用示例(运行时会输出内存使用报告)
# memory_intensive_function()

五、不同场景下的最佳实践

1. Web应用内存监控

# 在Flask应用中监控内存
from flask import Flask
import psutil
import os

app = Flask(__name__)

@app.route('/memory')
def check_memory():
    process = psutil.Process(os.getpid())
    mem_info = process.memory_info()
    return {
        'rss': f"{mem_info.rss / (1024**2):.2f} MB",  # 驻留集大小
        'vms': f"{mem_info.vms / (1024**2):.2f} MB",   # 虚拟内存大小
        'percent': f"{process.memory_percent():.1f}%"
    }

2. 数据处理任务监控

import pandas as pd
import numpy as np
from memory_profiler import memory_usage

def process_large_data():
    def inner():
        df = pd.DataFrame(np.random.rand(10000, 1000))
        return df.sum().sum()
    
    mem_usage = memory_usage((inner, (), {}))
    print(f"数据处理最大内存使用: {max(mem_usage):.2f} MB")

process_large_data()

3. 长期运行服务的监控

import time
import psutil

def monitor_memory_loop(interval=60):
    """定期监控内存使用"""
    while True:
        mem = psutil.virtual_memory()
        print(f"[{time.ctime()}] 内存使用: {mem.percent}%")
        time.sleep(interval)

# 在生产环境中建议使用日志记录而非print
# monitor_memory_loop()

六、注意事项

单位转换:注意不同API返回的单位可能是字节、KB或MB

共享内存:某些工具计算的内存可能包含共享库占用的内存

GC影响:Python的垃圾回收机制会影响内存测量结果

容器环境:在Docker等容器中,需要使用cgroup感知的工具

多线程:多线程环境下内存测量可能不准确

七、总结

方法适用场景特点
psutil系统级监控跨平台,信息全面
/proc/meminfoLinux系统直接读取内核信息
sys.getsizeof()对象大小简单快速,但不递归
pympler深度分析提供对象关系和变化跟踪
memory_profiler函数级监控装饰器方式,适合开发调试
tracemalloc内存变化跟踪Python内置,无需安装

根据具体需求选择合适的方法:

  • 系统级监控推荐psutil
  • 开发调试推荐memory_profilerpympler
  • 生产环境监控建议结合系统工具和自定义日志

通过合理使用这些工具,可以有效地监控和管理Python应用的内存使用情况。

到此这篇关于Python如何监控并获取内存使用情况的文章就介绍到这了,更多相关Python获取内存使用情况内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Pytorch maxpool的ceil_mode用法

    Pytorch maxpool的ceil_mode用法

    今天小编就为大家分享一篇Pytorch maxpool的ceil_mode用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Selenium之模拟登录铁路12306的示例代码

    Selenium之模拟登录铁路12306的示例代码

    这篇文章主要介绍了Selenium之模拟登录铁路12306的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 使用Dajngo 通过代码添加xadmin用户和权限(组)

    使用Dajngo 通过代码添加xadmin用户和权限(组)

    这篇文章主要介绍了使用Dajngo 通过代码添加xadmin用户和权限(组),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Python的元组和字典知识点超详细讲解

    Python的元组和字典知识点超详细讲解

    这篇文章主要介绍了Python中元组和字典两种数据结构的基本用法,包括初始化、索引、拼接、剔除、重复、最大值和最小值、键值查询、获取对应值、剔除、更新、添加和计算数量等操作,需要的朋友可以参考下
    2025-01-01
  • python动态参数用法实例分析

    python动态参数用法实例分析

    这篇文章主要介绍了python动态参数用法,以实例形式较为详细的分析了Python中动态参数的功能及使用技巧,需要的朋友可以参考下
    2015-05-05
  • 为项目选择的Python解释器无效两种解决方式

    为项目选择的Python解释器无效两种解决方式

    在编程和软件开发过程中,尤其是使用Python这类解释型语言时,选择合适的解释器(Interpreter)至关重要,这篇文章主要介绍了为项目选择的Python解释器无效的两种解决方式,需要的朋友可以参考下
    2025-09-09
  • Python去除字符串中的标点符号的最优方式

    Python去除字符串中的标点符号的最优方式

    在Python编程中,去除字符串标点符号是一项常见任务,关键在于文本分析和数据清洗,Python提供了多种方法,包括使用str.replace()、str.translate()结合str.maketrans(),以及使用正则表达式,另外,可以利用string模块中的punctuation属性快速实现
    2024-09-09
  • Python抠图教程之使用OpenCV实现背景去除

    Python抠图教程之使用OpenCV实现背景去除

    这篇文章主要给大家介绍了关于Python抠图教程之使用OpenCV实现背景去除的相关资料,背景去除是在很多视觉应用里的主要预处理步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • Python巧用SnowNLP实现生成srt字幕文件

    Python巧用SnowNLP实现生成srt字幕文件

    SnowNLP是一个可以方便的处理中文文本内容的python类库,本文主要为大家详细介绍了Python如何巧用SnowNLP实现将一段话一键生成srt字幕文件,感兴趣的可以了解下
    2024-01-01
  • Python测试框架pytest介绍

    Python测试框架pytest介绍

    这篇文章主要介绍了Python测试框架pytest介绍,Pytest是一个非常成熟的全功能的python测试框架,有简单灵活易上手、支持参数化等优点,下面其相关内容需要的小伙伴可以参考一下
    2022-03-03

最新评论