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),您也可以使用标准库模块resourcegetrusage()函数。 结果对象具有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'])