2009-11-19 19 views
18

Sto cercando di trovare un modo per limitare la memoria disponibile per la VM Python, come fa l'opzione "-Xmx" nella Java VM. (L'idea è di essere in grado di giocare con l'eccezione MemoryError)Memoria VM Limit Python

Non sono sicuro che questa opzione esiste ma potrebbe esserci una soluzione che utilizza un comando del sistema operativo per "isolare" un processo e la sua memoria.

Grazie.

risposta

11

Su * nix è possibile giocare con il comando ulimit, in particolare -m (dimensione massima della memoria) e -v (memoria virtuale).

+0

Grazie! Esattamente quello di cui avevo bisogno. –

3

Non perdere altro tempo.

Invece, se si desidera giocare con le eccezioni MemoryError creare un disegno che isola la costruzione dell'oggetto in modo da poterlo testare.

Invece di questo

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

considerare questo.

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

Ciò richiede una piccola aggiunta al progetto.

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

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

La funzione extra, a lungo termine, si rivela un buon modello di progettazione. È una Factory, e spesso hai bisogno di qualcosa di simile.

È quindi possibile sostituire questo makeAnotherClass con qualcosa di simile.

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) 

Questa versione solleverà un'eccezione senza dover limitare la memoria in qualche modo oscuro, insopportabile, complessa o magico.

+0

ronzio, risposta divertente :) Decisamente più complicato del primo e intrusivo nel mio codice. Oh, e grazie per averci insegnato qual è lo schema di progettazione di fabbrica. –

+0

Nei tuoi esempi sopra, potresti voler usare xrange invece di range (assumendo che questo non sia Python 3), altrimenti potresti esaurire la memoria per il motivo sbagliato. –

+1

@tweksteen: se pensate che sia "intrusivo", allora non avete fatto un corretto design basato sui test. Inoltre, se non stai usando le fabbriche, non stai permettendo l'espansione delle gerarchie di classi. Dovresti - seriamente - ripensare il tuo design in modo da utilizzare le fabbriche. –

33

Su Linux sto usando il modulo resource:

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

Funziona magnificamente, grazie. –