2009-11-19 3 views
18

Ich versuche eine Möglichkeit zu finden, den verfügbaren Speicher für die Python VM zu begrenzen, wie es die Option "-Xmx" in der Java VM tut. (Die Idee ist, mit der MemoryError-Ausnahme spielen zu können)Limit Python VM Speicher

Ich bin nicht sicher, ob diese Option existiert, aber es kann eine Lösung geben, die einen Befehl des Betriebssystems verwendet, um einen Prozess und seinen Speicher zu "isolieren".

Vielen Dank.

Antwort

11

Ein * nix können Sie mit dem Befehl ulimit spielen, insbesondere die -m (maximale Speichergröße) und -v (virtueller Speicher).

+0

Thank you! Genau das, was ich brauchte. –

3

Verschwenden Sie keine Zeit damit.

Wenn Sie stattdessen mit MemoryError Ausnahmen spielen möchten, erstellen Sie ein Design, das Objektkonstruktion isoliert, so dass Sie es testen können.

Statt dieser

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

Betrachten Sie diese.

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

Dies erfordert eine winzige Ergänzung zu Ihrem Design.

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

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

Die Zusatzfunktion - auf lange Sicht - erweist sich als gutes Designmuster. Es ist ein Factory, und Sie brauchen oft so etwas.

Sie können diese mit etwas wie diesem ersetzen.

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) 

wird diese Version eine Ausnahme auslösen, ohne dass Sie Speicher in irgendeiner obskuren, unsupportable, komplexe oder magische Art und Weise zu begrenzen ist.

+0

hum, lustige Antwort :) Definitiv komplizierter als die erste und aufdringlich in meinem Code. Oh, und danke, dass Sie uns beigebracht haben, was das Fabrikdesignmuster ist. –

+0

In Ihren obigen Beispielen möchten Sie vielleicht xrange anstelle von range verwenden (vorausgesetzt, es handelt sich nicht um Python 3), sonst könnte Ihnen der Speicher aus dem falschen Grund ausgehen. –

+1

@tweksteen: Wenn du denkst, dass es "aufdringlich" ist, dann hast du kein richtiges testgesteuertes Design gemacht. Wenn Sie keine Fabriken verwenden, erlauben Sie auch keine Erweiterung Ihrer Klassenhierarchien. Sie sollten - ernsthaft - Ihr Design überdenken, damit Sie Fabriken nutzen. –

33

Unter Linux Ich bin mit dem resource Modul:

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

Das funktioniert wunderbar, danke. –

Verwandte Themen