是否有一种方法可以让Python程序确定它当前使用了多少内存?我看到过关于单个对象的内存使用情况的讨论,但我需要的是进程的总内存使用情况,这样我就可以确定何时需要开始丢弃缓存的数据。
当前回答
这里有一个有用的解决方案,适用于各种操作系统,包括Linux, Windows等:
import os, psutil
process = psutil.Process(os.getpid())
print(process.memory_info().rss) # in bytes
注:
如果还没有安装,PIP是否安装psutil 如果你想快速知道你的进程需要多少MiB,这是一个方便的单行程序: 导入os, psutil;打印(psutil.Process (os.getpid ()) .memory_info()。RSS / 1024 ** 2) 在Python 2.7和psutil 5.6.3中,它是process.memory_info()[0](后来在API中有了更改)。
其他回答
在unix上,你可以使用ps工具来监视它:
$ ps u -p 1347 | awk '{sum=sum+$6}; END {print sum/1024}'
其中1347是某个进程id。同样,结果的单位是MB。
对于Unix系统,如果您传递-v,命令time (/usr/bin/time)将提供该信息。参见下面的最大驻留集大小,这是程序执行期间使用的最大(峰值)真实(而不是虚拟)内存:
$ /usr/bin/time -v ls /
Command being timed: "ls /"
User time (seconds): 0.00
System time (seconds): 0.01
Percent of CPU this job got: 250%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 0
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 315
Voluntary context switches: 2
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
在Windows上,你可以使用WMI(主页,cheeseshop):
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烹饪书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()函数。结果对象具有ru_maxrss属性,该属性给出了调用进程的内存使用峰值:
>>> resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
2656 # peak memory usage (kilobytes on Linux, bytes on OS X)
Python文档不记录单位。请参考您的特定系统的man getusage。2页检查该单位的值。在Ubuntu 18.04中,单位是千字节。在Mac OS X上,它是字节。
getrusage()函数也可以被赋予资源。获取子进程和(在某些系统上)资源的使用情况。RUSAGE_BOTH用于总(自我和子)进程使用情况。
如果你只关心Linux,你也可以阅读/proc/self/status或/proc/self/statm文件,就像这个问题和这个问题的其他答案中描述的那样。
我喜欢,谢谢@拜耳。现在我有了一个特定的进程计数工具。
# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB
# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB
附上我的流程清单。
$ ps aux | grep python
root 943 0.0 0.1 53252 9524 ? Ss Aug19 52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root 950 0.6 0.4 299680 34220 ? Sl Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root 3803 0.2 0.4 315692 36576 ? S 12:43 0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny 23325 0.0 0.1 47460 9076 pts/0 S+ 17:40 0:00 python
jonny 24651 0.0 0.0 13076 924 pts/4 S+ 18:06 0:00 grep python
参考
内存- Linux:找出什么进程正在使用所有的RAM?—超级用户 Python进程使用的内存总数?-堆叠溢出 linux - ps aux输出含义-超级用户
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录