Cómo limitar el uso de memoria dentro de un proceso python

Ejecuto Python 2.7 en una máquina Linux con un RAM de 16 GB y un sistema operativo de 64 bits. Un script de Python que escribí puede cargar demasiados datos en la memoria, lo que ralentiza la máquina hasta el punto en que ya ni siquiera puedo matar 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 propio script. 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, el uso de subprocess.call no funciona porque crea un proceso nuevo (¡sorpresa, sorpresa!), que es independiente del proceso en el que se ejecuta el progtwig python actual.

    resource.RLIMIT_VMEM es el recurso correspondiente a ulimit -v .

    RLIMIT_DATA solo afecta a las llamadas al sistema brk/sbrk mientras que los administradores de memoria más nuevos tienden a usar mmap lugar .

    La segunda cosa a tener en cuenta es que setrlimit / setrlimit solo afecta el proceso actual y sus futuros hijos.

    Con respecto a 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.