2010-02-22 18 views
45

A veces escribo programas de Python que son muy difíciles de determinar cuánta memoria usará antes de la ejecución. Como tal, a veces invoco un programa de Python que intenta asignar cantidades masivas de RAM causando que el kernel intercambie en gran medida y degrade el rendimiento de otros procesos en ejecución.Cómo limitar el tamaño del montón?

Debido a esto, deseo restringir la cantidad de memoria que puede crecer un montón de Python. Cuando se alcanza el límite, el programa simplemente se bloquea. ¿Cuál es la mejor manera de hacer esto?

Si es importante, se escribe mucho código en Cython, por lo que debe tener en cuenta la memoria asignada allí. No estoy casado con una solución pura de Python (no es necesario que sea portátil), por lo que todo lo que funciona en Linux está bien.

+4

Estoy confundido acerca de esta pregunta. Parece incluir una respuesta, pero no indica qué está mal con ella. – amcnabb

+0

Parece que ha copiado el código de la respuesta aceptada en su pregunta. ¿Presumiblemente es la solución? – fantabolous

+0

@amcnabb Eliminé la respuesta de la pregunta – Djizeus

Respuesta

45

Echa un vistazo resource.setrlimit(). Solo funciona en sistemas Unix, pero parece que podría ser lo que está buscando, ya que puede elegir un tamaño máximo de almacenamiento dinámico para su proceso y los elementos secundarios de su proceso con el parámetro resource.RLIMIT_DATA.

EDIT: Adición de un ejemplo:

import resource 

rsrc = resource.RLIMIT_DATA 
soft, hard = resource.getrlimit(rsrc) 
print 'Soft limit starts as :', soft 

resource.setrlimit(rsrc, (1024, hard)) #limit to one kilobyte 

soft, hard = resource.getrlimit(rsrc) 
print 'Soft limit changed to :', soft 

no estoy seguro de lo que su caso de uso es exactamente, pero es posible que se han de fijar un límite en el tamaño de la pila en su lugar con resouce.RLIMIT_STACK. Pasar este límite enviará una señal SIGSEGV a su proceso, y para manejarlo necesitará usar una pila de señal alternativa como se describe en el setrlimit Linux manpage. No estoy seguro de si sigaltstack se implementa en Python, por lo que podría ser difícil si desea recuperarse de ir más allá de este límite.

+3

¿Puedes dar un ejemplo? Traté de configurar varios rlimits de recursos, pero aún así fui capaz de asignar una lista de gigabytes. El módulo de recursos "se siente bien", pero no puedo hacer que funcione en Linux. – carl

+0

Agregué mi prueba a la pregunta. Tengo entendido que el programa Python debería finalizar una vez que se alcanza el límite. – carl

+2

Además, no me importa lo que sucede si se alcanza el límite: el programa puede bloquearse, bloquearse o lo que sea, siempre que no siga asignando más memoria. – carl

0

Eche un vistazo a ulimit. Permite establecer cuotas de recursos. Puede necesitar configuraciones apropiadas de kernel también.

+0

Cuando usa PAM de todos modos, '/ etc/security/limits.conf' es el mejor lugar para establecer los límites. 'ulimit' es solo una función de shell Bash. –

+0

ulimit usa las mismas llamadas al sistema que el módulo de recursos de Python – Willem

Cuestiones relacionadas