2015-05-15 26 views
20

Eseguo Python 2.7 su una macchina Linux con RAM da 16 GB e sistema operativo a 64 bit. Uno script python che ho scritto può caricare troppi dati in memoria, il che rallenta la macchina fino al punto in cui non posso nemmeno più uccidere il processo.Utilizzo della memoria limite?

Mentre posso limitare la memoria chiamando:

ulimit -v 12000000 

nel mio guscio prima di eseguire lo script, mi piacerebbe includere un'opzione di limitare nello script stesso. Ovunque guardassi, il modulo resource è citato come avente la stessa potenza di ulimit. Ma chiamando:

import resource 
_, hard = resource.getrlimit(resource.RLIMIT_DATA) 
resource.setrlimit(resource.RLIMIT_DATA, (12000, hard)) 

all'inizio del mio script non fa assolutamente nulla. Anche impostando il valore a partire da 12000 non si è mai verificato un crash del processo. Ho provato lo stesso con RLIMIT_STACK, con lo stesso risultato. Curiosamente, chiamando:

import subprocess 
subprocess.call('ulimit -v 12000', shell=True) 

non fa niente.

Cosa sto sbagliando? Non sono riuscito a trovare alcun esempio di utilizzo effettivo online.

+0

C'è spazio per rendere il programma più efficiente in termini di memoria? – TigerhawkT3

+1

C'è, ma ci vorrà un po '. Al momento, ho bisogno di testarlo e assicurarsi che non spenga il computer. E avere una sicurezza per la memoria sarà utile anche in seguito. – Arne

+1

Dato che è in Python 2.7, che ne dici di passare a Python 3 e usare un convertitore 2-a-3 sul tuo programma? Python 3 ha diversi miglioramenti delle prestazioni rispetto a Python 2, alcuni dei quali sono legati alla memoria. – TigerhawkT3

risposta

12

resource.RLIMIT_VMEM è la risorsa corresponding to ulimit -v.

RLIMIT_DATAonly affects brk/sbrk system calls mentre newer memory managers tend to use mmap instead.

La seconda cosa da notare è che ulimit/setrlimit riguarda solo il processo corrente e i suoi figli futuri.

Per quanto riguarda il messaggio AttributeError: 'module' object has no attribute 'RLIMIT_VMEM': il resource module docs menzionano questa possibilità:

This module does not attempt to mask platform differences — symbols not defined for a platform will not be available from this module on that platform.

Secondo il bashulimit source linkato sopra, utilizza RLIMIT_AS se RLIMIT_VMEM non è definito.

+1

Non uso il multithreading, quindi spero che non sia questo il problema. Ma quando entro 'RLIMIT_DATA', ricevo il seguente messaggio di errore: ' Traceback (chiamata più recente scorso): file "my_script.py", la linea 417, in sys.exit (main()) File "mio_script.py ", riga 391, in main _, hard = resource.getrlimit (resource.RLIMIT_VMEM) AttributeError: l'oggetto 'module' non ha attributo 'RLIMIT_VMEM'' Dall'elenco a cui si fa riferimento, è possibile trovare tutti i campi - eccetto questo .. Sto cercando di eseguirlo con Python 3.x adesso .. – Arne

+0

Grazie per i chiarimenti! – Arne