Python进程使用的总内存是多少?

451 投票
12 回答
449193 浏览
提问于 2025-04-15 11:59

有没有办法让一个Python程序知道它现在使用了多少内存?我看到过关于单个对象内存使用的讨论,但我需要的是整个程序的总内存使用情况,这样我才能判断什么时候需要开始清理缓存的数据。

12 个回答

69

在Windows系统上,你可以使用WMI(Windows管理工具接口),这是一个可以帮助你获取系统信息的工具。你可以在这里找到它的主页,还有在这个网站上下载。

def memory():
    import os
    from wmi import WMI
    w = WMI('.')
    result = w.query("SELECT WorkingSet FROM Win32_PerfRawData_PerfProc_Process WHERE IDProcess=%d" % os.getpid())
    return int(result[0].WorkingSet)

在Linux系统上,你可以参考Python Cookbook中的内容,具体可以查看这个链接:http://code.activestate.com/recipes/286222/

import os
_proc_status = '/proc/%d/status' % os.getpid()

_scale = {'kB': 1024.0, 'mB': 1024.0*1024.0, 'KB': 1024.0, 'MB': 1024.0*1024.0}

def _VmB(VmKey):
    '''Private.'''
    global _proc_status, _scale
     # get pseudo file  /proc/<pid>/status
    try:
        t = open(_proc_status)
        v = t.read()
        t.close()
    except:
        return 0.0  # non-Linux?
     # get VmKey line e.g. 'VmRSS:  9999  kB\n ...'
    i = v.index(VmKey)
    v = v[i:].split(None, 3)  # whitespace
    if len(v) < 3:
        return 0.0  # invalid format?
     # convert Vm value to bytes
    return float(v[1]) * _scale[v[2]]

def memory(since=0.0):
    '''Return memory usage in bytes.'''
    return _VmB('VmSize:') - since

def resident(since=0.0):
    '''Return resident memory usage in bytes.'''
    return _VmB('VmRSS:') - since

def stacksize(since=0.0):
    '''Return stack size in bytes.'''
    return _VmB('VmStk:') - since
292

对于基于Unix的系统(比如Linux、Mac OS X和Solaris),你可以使用标准库模块中的getrusage()函数,模块名是resource。这个函数返回的对象有一个属性叫ru_maxrss,它表示调用这个函数的进程的峰值内存使用量:

>>> resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
2656  # peak memory usage (kilobytes on Linux, bytes on OS X)

Python文档中没有说明单位。你可以查看你系统的man getrusage.2页面来确认这个值的单位。在Ubuntu 18.04上,单位是千字节,而在Mac OS X上,单位是字节。

你还可以给getrusage()函数传入resource.RUSAGE_CHILDREN,这样可以获取子进程的内存使用情况;在某些系统上,你也可以用resource.RUSAGE_BOTH来获取总的(包括自己和子进程)内存使用情况。

如果你只关心Linux系统,你还可以按照其他答案中提到的方法,直接读取/proc/self/status/proc/self/statm文件。

549

这里有一个很实用的解决方案,适用于多种操作系统,包括Linux、Windows等:

import psutil
process = psutil.Process()
print(process.memory_info().rss)  # in bytes 

注意事项:

  • 如果还没安装,请运行 pip install psutil 来安装这个库。

  • 如果你想快速了解你的程序占用了多少MiB的内存,可以用下面这行简单的代码:

    import os, psutil; print(psutil.Process(os.getpid()).memory_info().rss / 1024 ** 2)
    
  • 在使用Python 2.7和psutil 5.6.3时,应该用 process.memory_info()[0] 来获取内存信息(后来API有了变化)。

撰写回答