2010-06-22 11 views
7

La memoria del processo del mio codice Python aumenta dinamicamente mentre memorizza i dati dinamici in elenco, dizionario e tuple ovunque sia necessario. Sebbene tutti quei dati dinamici siano cancellati fisicamente nelle loro variabili dopo di allora, la memoria non si abbassa.crescente memoria del processo python nel tempo

Quindi mi sono sentito come se ci fosse una perdita di memoria e ho usato il metodo gc.collect() per raccogliere tutta la memoria non condivisa. Ma non potrei ridurre al minimo la memoria quando non ci sono dati nelle variabili.

+0

Perché ti aspetti che scenda? Quale sistema operativo stai usando? In molti sistemi operativi, una volta che un processo ha acquisito memoria, il processo rimane così grande. –

+0

Sto usando mac osx 10.5, credo che più avanti mangerebbe più spazio. al momento era cresciuto di circa 15 MB in più da 24 MB nella fase iniziale. Credo che la memoria del processo dovrebbe aumentare in termini di MB, il che potrebbe influire sulla dimensione della memoria disponibile. – herby

risposta

6

E 'molto difficile, in generale, per un processo di "dare memoria indietro al sistema operativo" (fino a quando il processo termina e il sistema operativo torna tutto la memoria, ovviamente), perché (nella maggior parte implementazione) cosa malloc i ritorni sono ricavati da grandi blocchi per l'efficienza, ma l'intero blocco non può essere restituito se una parte di esso è ancora in uso - quindi, la maggior parte delle librerie standard C non ci provano nemmeno.

Per una discussione decente in un contesto Python, vedere ad es. here. Evan Jones ha risolto alcuni problemi specifici di Python come descritto in here e here, ma la sua patch è nel trunk da Python 2.5, quindi i problemi che stai osservando sono sicuramente con il pacchetto malloc di sistema, non con Python di per sé. Una spiegazione specifica per il 2.6 è here e here.

thread A SO è here, dove Hugh Allen nella sua risposta cita i programmatori di Firefox al estendere che Mac OS X è un sistema in cui è praticamente impossibile per un processo di dare memoria indietro al sistema operativo.

Quindi, solo terminando un processo puoi essere sicuro di rilasciare la sua memoria. Ad esempio, un server di lunga durata, una volta ogni tanto, può eseguire lo snapshot del suo stato su disco e spegnerlo (con un processo minuscolo di watchdog, sistema o personalizzato, controllarlo e riavviarlo). Se sai che la prossima operazione richiederà molta memoria per un breve periodo di tempo, spesso puoi fare lo os.fork, fare il lavoro affamato di memoria nel processo figlio e avere i risultati (se ce ne sono) restituiti al processo genitore tramite una pipe come il processo figlio termina. E così via e così via.

0

Quanto siamo grandi? Python stesso occupa una certa quantità di memoria ... credo che fino a 30 o 40 MB. Se è più grande di quello e non viene raccolto, si ha una perdita di memoria. Solo i rifiuti senza riferimenti possono essere raccolti, in qualche modo le tue cose extra sono ancora referenziate. Fai un profilo di memoria e guarda cosa sta succedendo.

+0

al momento era cresciuto di circa 15 MB in più da 24 MB nella fase iniziale per uno scenario minimo. Tuttavia ho provato lo strumento di collegamento sottostante da cui ho trovato i dati di riferimento non sono più di 3 MB. Non ho potuto ottenere la quantità rimanente di dettagli di memoria. – herby

+0

Non è così grande. Se stai cercando un programma di memoria super basso, di solito non esegui il codice in Python. La maggior parte dei PC ha 2-4 GB di RAM, non vale la pena preoccuparsi di 15 MB. – bwawok

Problemi correlati