[Python] RAM e dimensioni file

Roberto De Ioris roberto a unbit.it
Gio 24 Set 2009 08:36:18 CEST


On Wed, 2009-09-23 at 19:19 +0200, Ernesto wrote:
> > Nel senso la memoria esitente...bo non capisco cmq per vedere la
> > quantita di memoria del sistema su Linux
> >
> In pratica, vorrei aggiungere un'opzione in uno script che in funzione  
> della memoria a disposizione possa scegliere se caricare o meno tutte  
> le info contenute in un file dato in input.
> 
> Ernesto

IMHO, ti stai complicando inutilmente la vita.

Proprio per farla semplice, non esiste piu' il concetto di "memoria
libera" ma si usa quello di "memoria ancora non utilizzata".

Questo perche' e' oramai un assioma che memoria non utilizzata e' uguale
a memoria sprecata.

Per questo motivo, su qualsiasi sistema operativo moderno dopo poco
tempo troverai tutta (o buona parte) della memoria occupata anche se
apparentemente non la sta usando nessuno.

Buona parte su Linux viene utilizzata per la page cache e all'occorrenza
viene ridata ai processi che ne abbiano bisogno.

Poi hai la swap, che per il tuo processo e' memoria utilizzabile.

Ci sono poi i limiti che ogni bravo sysadmin dovrebbe imporre ai
processi non privilegiati, tra cui c'e' anche quello della memoria
virtuale (l'address space).

Sono gia' tre cose che devi tenere in considerazione.

Non vuoi che il tuo file finisca in swap ? allora dovrai allocare la
memoria e poi lockarla oppure usare la funzione (in C)
mlockall(MCL_FUTURE) che locka tutto il cucuzzaro. 
Questo introduce un'altra porzione al tuo codice (tra l'altro non so
neanche se mlockall sia esportata in python o se dovrai implementarla a
manina).

Una prima formula per ricavare quanta memoria ha a disposizione il tuo
processo potrebbe essere:

Memoria_fisica_libera + Page_Cache (li ricavi sempre
leggendo /proc/meminfo)

Poi devi usare getrlimit() per sapere se la memoria che puo' mappare il
tuo processo rientra nei limiti. 

Per sapere quanta memoria ha mappato gia' il tuo processo devi leggere
il file /proc/self/stat ("man proc" ti aiutera' a farne il parsing)

Tieni sempre a mente che si sta parlando di memoria virtuale, sapere
quanta memoria fisica occupa un processo e' materia oscura, e Linux
stesso si basa su un compromesso che spesso e volentieri non corrisponde
a realta'. Per questo motivo non puoi neanche limitare la quantita' di
memoria fisica che un singolo processo (sebbene setrlimit lo preveda)
puo' allocare.

Se dopo tutto questo pippone sei ancora convinto che sia l'approccio
giusto, direi che hai tutto cio' che ti serve :)




-- 
Roberto De Ioris
http://unbit.it
JID: roberto a jabber.unbit.it



Maggiori informazioni sulla lista Python