Determinar la memoria RAM libre en Python

Me gustaría que mi script de Python use toda la RAM libre disponible pero no más (por razones de eficiencia). Puedo controlar esto leyendo solo una cantidad limitada de datos, pero necesito saber cuánta RAM es libre en tiempo de ejecución para hacer esto correctamente. Se ejecutará en una variedad de sistemas Linux. ¿Es posible determinar la memoria RAM libre en tiempo de ejecución?

Usted podría simplemente leer /proc/meminfo . Tenga en cuenta que la “memoria libre” suele ser bastante baja, ya que el sistema operativo utiliza en gran medida la memoria libre y no utilizada para el almacenamiento en caché.

Además, es mejor si no intenta ser más inteligente que la administración de memoria de su sistema operativo. Eso usualmente acaba en lágrimas (o progtwigs más lentos). Mejor solo toma la memoria RAM que necesitas. Si desea utilizar todo lo que pueda en una máquina con una cantidad de memoria desconocida anteriormente, probablemente verificará la cantidad de RAM instalada ( MemTotal en /proc/meminfo ), dejar una cierta cantidad para el sistema operativo y como seguridad Marcar (digamos 1 GB) y utilizar el rest.

En los sistemas Linux, lo uso de vez en cuando:

 def memory(): """ Get node total memory and memory usage """ with open('/proc/meminfo', 'r') as mem: ret = {} tmp = 0 for i in mem: sline = i.split() if str(sline[0]) == 'MemTotal:': ret['total'] = int(sline[1]) elif str(sline[0]) in ('MemFree:', 'Buffers:', 'Cached:'): tmp += int(sline[1]) ret['free'] = tmp ret['used'] = int(ret['total']) - int(ret['free']) return ret 

Puedes ejecutar esto cuando se inicie tu script. La RAM se suele utilizar y liberar con bastante frecuencia en un sistema ocupado, por lo que debe tenerlo en cuenta antes de decidir la cantidad de RAM que se debe utilizar. Además, la mayoría de los sistemas linux tienen un valor de swappiness de 60. Cuando se usa la memoria, las páginas que se usan con menos frecuencia se intercambiarán. Puedes encontrarte utilizando SWAP en lugar de RAM.

Espero que esto ayude.

Desde que el póster original escribió que el código debería ejecutarse en una variedad de sistemas Linux , estoy publicando aquí una solución orientada a objetos para la consulta de memoria de Linux. psutil es una gran biblioteca, pero si no puede instalarla por alguna razón, simplemente puede usar la siguiente solución:

Ejemplo de uso:

 >>> f = FreeMemLinux() >>> print f.total, f.used, f.user_free 8029212 3765960 4464816 >>> >>> f_mb = FreeMemLinux(unit='MB') >>> print f_mb.total, f_mb.used, f_mb.user_free 7841.02734375 3677.6953125 4360.171875 >>> >>> f_percent = FreeMemLinux(unit='%') >>> print f_percent.total, f_percent.used, f_percent.user_free 100.0 46.9032328453 55.60715049 

Código:

 class FreeMemLinux(object): """ Non-cross platform way to get free memory on Linux. Note that this code uses the `with ... as`, which is conditionally Python 2.5 compatible! If for some reason you still have Python 2.5 on your system add in the head of your code, before all imports: from __future__ import with_statement """ def __init__(self, unit='kB'): with open('/proc/meminfo', 'r') as mem: lines = mem.readlines() self._tot = int(lines[0].split()[1]) self._free = int(lines[1].split()[1]) self._buff = int(lines[2].split()[1]) self._cached = int(lines[3].split()[1]) self._shared = int(lines[20].split()[1]) self._swapt = int(lines[14].split()[1]) self._swapf = int(lines[15].split()[1]) self._swapu = self._swapt - self._swapf self.unit = unit self._convert = self._factor() def _factor(self): """determine the convertion factor""" if self.unit == 'kB': return 1 if self.unit == 'k': return 1024.0 if self.unit == 'MB': return 1/1024.0 if self.unit == 'GB': return 1/1024.0/1024.0 if self.unit == '%': return 1.0/self._tot else: raise Exception("Unit not understood") @property def total(self): return self._convert * self._tot @property def used(self): return self._convert * (self._tot - self._free) @property def used_real(self): """memory used which is not cache or buffers""" return self._convert * (self._tot - self._free - self._buff - self._cached) @property def shared(self): return self._convert * (self._tot - self._free) @property def buffers(self): return self._convert * (self._buff) @property def cached(self): return self._convert * self._cached @property def user_free(self): """This is the free memory available for the user""" return self._convert *(self._free + self._buff + self._cached) @property def swap(self): return self._convert * self._swapt @property def swap_free(self): return self._convert * self._swapf @property def swap_used(self): return self._convert * self._swapu 

Otra opción es el paquete psutil Python, psutil :

 stats = psutil.virtual_memory() # returns a named tuple available = getattr(stats, 'available') print(available) 

Según la documentación , el campo available “se calcula sumndo diferentes valores de memoria en función de la plataforma y se supone que se debe usar para monitorear el uso real de la memoria en una plataforma multiplataforma “.

Tenga en cuenta que el valor de retorno será en bytes

Supongo que podría usar free ( http://www.cyberciti.biz/faq/linux-check-memory-usage/ ), ps o tal vez la clase MemoryMonitor del hilo SO publicado en la parte inferior de mi respuesta para hacer esta. Simplemente elimine un poco la holgura y deje una pequeña cantidad de ram no utilizado para otros procesos si lo necesitan con urgencia para evitar las escrituras en disco en su nombre.

Necesitará analizar la salida de libre o ps si usa eso, pero no debería ser difícil. Recuerde que necesita analizar la memoria RAM disponible en tiempo real, de modo que pueda ajustar si otro proceso tiene hambre de memoria por algún motivo.

también vea este hilo: ¿Cómo obtener el uso actual de CPU y RAM en Python?