memory.py
1 from __future__ import division 2 # derived from https://stackoverflow.com/questions/938733/total-memory-used-by-python-process 3 from builtins import object 4 from past.utils import old_div 5 import os 6 class Memory(object): 7 8 def __init__(self): 9 self._proc_status = '/proc/%d/status' % os.getpid() 10 self._scale = {'kB': 1024.0, 'mB': 1024.0*1024.0, 'KB': 1024.0, 'MB': 1024.0*1024.0} 11 12 def _VmB(self,VmKey): 13 '''Private. 14 ''' 15 # get pseudo file /proc/<pid>/status 16 try: 17 t = open(self._proc_status) 18 v = t.read() 19 t.close() 20 except: 21 return 0.0 # non-Linux? 22 # get VmKey line e.g. 'VmRSS: 9999 kB\n ...' 23 i = v.index(VmKey) 24 v = v[i:].split(None, 3) # whitespace 25 if len(v) < 3: 26 return 0.0 # invalid format? 27 # convert Vm value to bytes 28 return float(v[1]) * self._scale[v[2]] 29 30 31 def memory(self,scale='mB'): 32 return old_div(self._VmB('VmSize:'), self._scale[scale]) 33 34 35 def resident(self,scale='mB'): 36 return old_div(self._VmB('VmRSS:'), self._scale[scale]) 37 38 39 def stacksize(self,scale='mB'): 40 return old_div(self._VmB('VmStk:'), self._scale[scale])