Cómo limitar el uso de memoria dentro de un proceso de python
linux memory (1)
resource.RLIMIT_VMEM
es el recurso correspondiente a ulimit -v
.
RLIMIT_DATA
solo afecta las llamadas al sistema brk/sbrk
mientras que los administradores de memoria más nuevos tienden a usar mmap
lugar .
Lo segundo que se debe tener en cuenta es que setrlimit
/ setrlimit
solo afecta el proceso actual y sus futuros hijos.
Con respecto al AttributeError: ''module'' object has no attribute ''RLIMIT_VMEM''
mensaje: los documentos del módulo de resource
mencionan esta posibilidad:
Este módulo no intenta enmascarar las diferencias de plataforma: los símbolos no definidos para una plataforma no estarán disponibles desde este módulo en esa plataforma.
De acuerdo con la fuente de bash
ulimit
vinculada a lo anterior, usa RLIMIT_AS
si RLIMIT_VMEM
no está definido.
Ejecuto Python 2.7 en una máquina Linux con un RAM de 16 GB y un sistema operativo de 64 bits. Una secuencia de comandos de Python que escribí puede cargar demasiados datos en la memoria, lo que ralentiza la máquina hasta el punto en que ya no puedo detener el proceso.
Si bien puedo limitar la memoria llamando:
ulimit -v 12000000
en mi shell antes de ejecutar el script, me gustaría incluir una opción de limitación en el script mismo. Dondequiera que miré, el módulo de resource
se cita con el mismo poder que ulimit
. Pero llamando:
import resource
_, hard = resource.getrlimit(resource.RLIMIT_DATA)
resource.setrlimit(resource.RLIMIT_DATA, (12000, hard))
Al principio de mi guión no hace absolutamente nada. Incluso establecer el valor tan bajo como 12000 nunca colapsó el proceso. Intenté lo mismo con RLIMIT_STACK
, y con el mismo resultado. Curiosamente, llamando:
import subprocess
subprocess.call(''ulimit -v 12000'', shell=True)
no hace nada tambien
¿Qué estoy haciendo mal? No pude encontrar ningún ejemplo de uso real en línea.
edit: para cualquier persona que tenga curiosidad, usar subprocess.call
no funciona porque crea un proceso nuevo (¡sorpresa, sorpresa!), que es independiente del proceso en el que se ejecuta el programa python actual.