<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><blockquote type="cite"><div><blockquote type="cite"><br><font class="Apple-style-span" color="#000000"><br></font></blockquote><br>IMHO, ti stai complicando inutilmente la vita.<br><br>Proprio per farla semplice, non esiste piu' il concetto di "memoria<br>libera" ma si usa quello di "memoria ancora non utilizzata".<br><br>Questo perche' e' oramai un assioma che memoria non utilizzata e' uguale<br>a memoria sprecata.<br><br>Per questo motivo, su qualsiasi sistema operativo moderno dopo poco<br>tempo troverai tutta (o buona parte) della memoria occupata anche se<br>apparentemente non la sta usando nessuno.<br><br>Buona parte su Linux viene utilizzata per la page cache e all'occorrenza<br>viene ridata ai processi che ne abbiano bisogno.<br><br>Poi hai la swap, che per il tuo processo e' memoria utilizzabile.<br><br>Ci sono poi i limiti che ogni bravo sysadmin dovrebbe imporre ai<br>processi non privilegiati, tra cui c'e' anche quello della memoria<br>virtuale (l'address space).<br><br>Sono gia' tre cose che devi tenere in considerazione.<br><br>Non vuoi che il tuo file finisca in swap ? allora dovrai allocare la<br>memoria e poi lockarla oppure usare la funzione (in C)<br>mlockall(MCL_FUTURE) che locka tutto il cucuzzaro. <br>Questo introduce un'altra porzione al tuo codice (tra l'altro non so<br>neanche se mlockall sia esportata in python o se dovrai implementarla a<br>manina).<br><br>Una prima formula per ricavare quanta memoria ha a disposizione il tuo<br>processo potrebbe essere:<br><br>Memoria_fisica_libera + Page_Cache (li ricavi sempre<br>leggendo /proc/meminfo)<br><br>Poi devi usare getrlimit() per sapere se la memoria che puo' mappare il<br>tuo processo rientra nei limiti. <br><br>Per sapere quanta memoria ha mappato gia' il tuo processo devi leggere<br>il file /proc/self/stat ("man proc" ti aiutera' a farne il parsing)<br><br>Tieni sempre a mente che si sta parlando di memoria virtuale, sapere<br>quanta memoria fisica occupa un processo e' materia oscura, e Linux<br>stesso si basa su un compromesso che spesso e volentieri non corrisponde<br>a realta'. Per questo motivo non puoi neanche limitare la quantita' di<br>memoria fisica che un singolo processo (sebbene setrlimit lo preveda)<br>puo' allocare.<br><br>Se dopo tutto questo pippone sei ancora convinto che sia l'approccio<br>giusto, direi che hai tutto cio' che ti serve :)<br><br></div></blockquote></div>Grazie mille per tutte le precisazioni. In teoria credo che l'approccio sia corretto o almeno lecito. In pratica le cose cambiano poiché per quello che ho inteso non è semplice tradurre il tutto in codice platform independent. Probabilmente posso aggirare l'ostacolo in due modi diversi:<div>1. stimando la quantità di memoria necessaria per allocare un intero file, per cui l'utente potrà decidere se andare avanti o meno</div><div>2. caricare il file in memoria fin quando sarà sollevata un'eccezione. Se questa eventualità si dovesse verificare, le info necessarie del file saranno indicizzate su disco. Questo rallenterà un po' lo script ma va bene così...</div><div><br></div><div>Ernesto</div></body></html>