2009-11-19 19 views
18

Estoy tratando de encontrar una manera de limitar la memoria disponible para la máquina virtual de Python, como lo hace la opción "-Xmx" en la máquina virtual de Java. (La idea es poder jugar con la excepción MemoryError)Limitar memoria de Python VM

No estoy seguro de que exista esta opción, pero puede haber una solución usando un comando del SO para "aislar" un proceso y su memoria.

Gracias.

Respuesta

11

En * nix puede jugar con el comando ulimit, específicamente el -m (tamaño máximo de memoria) y -v (memoria virtual).

+0

Gracias! Exactamente lo que necesitaba. –

3

No pierdas el tiempo en esto.

En su lugar, si desea jugar con excepciones MemoryError, cree un diseño que aísle la construcción del objeto para que pueda probarlo.

En lugar de esto

for i in range(1000000000000000000000): 
    try: 
     y = AnotherClass() 
    except MemoryError: 
     # the thing we wanted to test 

considerar esto.

for i in range(1000000000000000000000): 
    try: 
     y = makeAnotherClass() 
    except MemoryError: 
     # the thing we wanted to test 

Esto requiere una pequeña adición a su diseño.

class AnotherClass(object): 
    def __init__(self, *args, **kw): 
    blah blah blah 

def makeAnotherClass(*args, **kw): 
    return AnotherClass(*args, **kw) 

La función extra, en el largo plazo, demuestra ser un buen patrón de diseño. Es una fábrica , y a menudo necesita algo como eso.

Puede reemplazar este makeAnotherClass con algo como esto.

class Maker(object): 
    def __init__(self, count= 12): 
     self.count= count 
    def __call__(self, *args, **kw): 
     if self.count == 0: 
      raise MemoryError 
     self.count -= 1 
     return AnotherClass(*args, **kw) 
makeAnotherClass= Maker(count=12) 

Esta versión se lanzará una excepción sin que tenga que limitar la memoria de ninguna manera oscura, insoportable, complejo o mágico.

+0

zumbido, respuesta divertida :) Definitivamente más complicado que el primero e intrusivo en mi código. Ah, y gracias por enseñarnos cuál es el patrón de diseño de la fábrica. –

+0

En los ejemplos anteriores, es posible que desee utilizar xrange en lugar de rango (suponiendo que esto no es Python 3), de lo contrario, podría quedarse sin memoria por el motivo equivocado. –

+1

@tweksteen: si crees que es "intrusivo", entonces no has realizado un diseño adecuado basado en pruebas. Además, si no está utilizando fábricas, no está permitiendo la expansión de las jerarquías de su clase. Deberías, en serio, reconsiderar tu diseño para que uses fábricas. –

33

En Linux que estoy usando el módulo resource:

import resource 
resource.setrlimit(resource.RLIMIT_AS, (megs * 1048576L, -1L)) 
+0

Esto funciona maravillosamente, gracias. –

Cuestiones relacionadas