python linux memory ulimit

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.