Python进程使用的内存总量?
有没有办法让Python程序来确定它目前正在使用多less内存? 我已经看到关于单个对象的内存使用情况的讨论,但我需要的是该进程的总内存使用情况,以便我可以确定何时需要开始丢弃caching的数据。
在Windows上,您可以使用WMI( 主页 , 奶酪店 ):
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 eg '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),您也可以使用标准库模块resource
的getrusage()
函数。 结果对象具有ru_maxrss
属性,这为调用进程提供了高峰内存使用量:
>>> resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 2656 # peak memory usage (bytes on OS X, kilobytes on Linux)
Python文档并不清楚单元是什么,但用于getrusage(2)
的Mac OS X手册页将单元描述为字节 。 Linux手册页不清楚,但它似乎相当于从/proc/self/status
,这是千字节的信息 。
getrusage()
函数也可以被赋予resource.RUSAGE_CHILDREN
来获取subprocess的使用情况,以及(在某些系统上) resource.RUSAGE_BOTH
获得总(自我和子)进程的使用情况。
resource
是一个标准的库模块。
如果你只关心Linux,你可以按照类似的问题来查看/proc/self/status
文件。
这是一个有用的解决scheme,适用于各种操作系统,包括Windows 7 x64:
import os import psutil process = psutil.Process(os.getpid()) print(process.memory_info().rss)
在unix上,你可以使用ps
工具来监视它:
$ ps u -p 1347 | awk '{sum=sum+$6}; END {print sum/1024}'
其中1347是一些进程ID。 另外,结果是MB。
Heapy (和朋友)可能是你正在寻找的东西。
另外,高速caching通常在其大小上有固定的上限,以解决您所讨论的问题。 例如,看看这个LRUcaching修饰器 。
使用sh和os进入python bayer的答案。
float(sh.awk(sh.ps('u','-p',os.getpid()),'{sum=sum+$6}; END {print sum/1024}'))
答案是兆字节。
我喜欢它 ,感谢@bayer。 我现在得到一个特定的stream程统计工具。
# 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:找出哪个进程正在使用所有的内存? – 超级用户
- Python进程使用的内存总量? – 堆栈溢出
- linux – ps aux输出含义 – 超级用户
han = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION|win32con.PROCESS_VM_READ, 0, os.getpid()) process_memory = int(win32process.GetProcessMemoryInfo(han)['WorkingSetSize'])