lenguaje - Python equivalente de memory_get_usage()?
python wikipedia (5)
Reglas de respuesta aceptadas, pero podría ser más fácil (y más portátil) usar psutil . Hace lo mismo y mucho más.
ACTUALIZACIÓN: muppy también es muy conveniente (y está mucho mejor documentado que guppy / heapy).
Ya encontré la siguiente pregunta , pero me preguntaba si habría una forma más rápida y más sucia de obtener una estimación de la cantidad de memoria que el intérprete de Python está usando actualmente para mi script que no depende de bibliotecas externas.
Vengo de PHP y solía usar memory_get_usage() y memory_get_peak_usage() mucho para este propósito y esperaba encontrar un equivalente.
También puede usar la función getrusage()
del resource
módulo de biblioteca estándar. El objeto resultante tiene el atributo ru_maxrss
, que proporciona el uso de memoria total para el proceso de llamada:
>>> import resource
>>> resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
2656
Los documentos de Python no tienen claro cuáles son exactamente las unidades, pero la página de getrusage(2)
Mac OS X para getrusage(2)
describe las unidades como kilobytes.
La página de manual de Linux no está clara, pero parece ser equivalente a la información de /proc/self/status
(es decir, kilobytes) descrita en la respuesta aceptada. Para el mismo proceso anterior, que se ejecuta en Linux, la función enumerada en la respuesta aceptada proporciona:
>>> memory_usage()
{''peak'': 6392, ''rss'': 2656}
Puede que no sea tan fácil de usar como la solución /proc/self/status
, pero es una biblioteca estándar, por lo que (siempre que las unidades sean estándar) debe ser multiplataforma y se puede utilizar en sistemas que carecen de /proc/
( por ejemplo, Mac OS X y otros Unixes, tal vez Windows).
Además, a la función getrusage()
también se le puede getrusage()
resource.RUSAGE_CHILDREN
para obtener el uso para procesos secundarios, y (en algunos sistemas) resource.RUSAGE_BOTH
para el uso total del proceso (propio y secundario).
Esto cubrirá el caso memory_get_usage()
, pero no incluye el uso máximo. No estoy seguro de si alguna otra función del módulo de resource
puede dar un uso máximo.
prueba heapy
/proc/self/status
tiene las siguientes claves relevantes:
- VmPeak : Tamaño máximo de memoria virtual.
- VmSize : Tamaño de memoria virtual.
- VmHWM : Tamaño máximo del conjunto residente ("marca de límite superior").
- VmRSS : Tamaño del conjunto residente.
Entonces, si la preocupación es la memoria residente, el siguiente código puede usarse para recuperarla:
def get_proc_status(keys = None):
with open(''/proc/self/status'') as f:
data = dict(map(str.strip, line.split('':'', 1)) for line in f)
return tuple(data[k] for k in keys) if keys else data
peak, current = get_proc_status((''VmHWM'', ''VmRSS''))
print(peak, current) # outputs: 14280 kB 13696 kB
Aquí hay un artículo del autor de memory_profiler que explica que getrusage
de ru_maxrss
no es siempre una medida práctica. También tenga en cuenta que, VmHWM
puede diferir de ru_maxrss
(lo que veo en algunos casos ru_maxrss
es mayor). Pero en el caso simple son lo mismo:
import resource
def report():
maxrss = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
peak, current = get_proc_status((''VmHWM'', ''VmRSS''))
print(current, peak, maxrss)
report()
s = '' '' * 2 ** 28 # 256MiB
report()
s = None
report()
Además, aquí hay un estudio de caso muy comprensible pero informativo por parte de autores que explica qué es el kernel, la memoria virtual y la memoria residente, y cómo son interdependientes.
Una solución simple para Linux y otros sistemas con /proc/self/status
es el siguiente código, que uso en un proyecto mío:
def memory_usage():
"""Memory usage of the current process in kilobytes."""
status = None
result = {''peak'': 0, ''rss'': 0}
try:
# This will only work on systems with a /proc file system
# (like Linux).
status = open(''/proc/self/status'')
for line in status:
parts = line.split()
key = parts[0][2:-1].lower()
if key in result:
result[key] = int(parts[1])
finally:
if status is not None:
status.close()
return result
Devuelve el tamaño actual y máximo de la memoria residente (que es probablemente lo que las personas quieren decir cuando hablan de la cantidad de RAM que usa una aplicación). Es fácil extenderlo para obtener otros datos del archivo /proc/self/status
.
Para los curiosos: la salida completa de cat /proc/self/status
ve así:
% cat /proc/self/status
Name: cat
State: R (running)
Tgid: 4145
Pid: 4145
PPid: 4103
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 32
Groups: 20 24 25 29 40 44 46 100 1000
VmPeak: 3580 kB
VmSize: 3580 kB
VmLck: 0 kB
VmHWM: 472 kB
VmRSS: 472 kB
VmData: 160 kB
VmStk: 84 kB
VmExe: 44 kB
VmLib: 1496 kB
VmPTE: 16 kB
Threads: 1
SigQ: 0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed: 03
Cpus_allowed_list: 0-1
Mems_allowed: 1
Mems_allowed_list: 0
voluntary_ctxt_switches: 0
nonvoluntary_ctxt_switches: 0