Python进程使用的总内存是多少?
有没有办法让一个Python程序知道它现在使用了多少内存?我看到过关于单个对象内存使用的讨论,但我需要的是整个程序的总内存使用情况,这样我才能判断什么时候需要开始清理缓存的数据。
12 个回答
在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
对于基于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
文件。
这里有一个很实用的解决方案,适用于多种操作系统,包括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有了变化)。