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 :)

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: 1. stimando la quantità di memoria necessaria per allocare un intero file, per cui l'utente potrà decidere se andare avanti o meno 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ì...

Ernesto
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a