Il principio di un file mappato in memoria è abbastanza portabile, ma non hai mmap() su Windows (ma esistono cose come MapViewOfFile()). Potresti dare un'occhiata al codice c dei moduli mmap di Python per vedere come lo fanno per varie piattaforme.
L'uso di mmap per leggere i file non è portabile se ti affidi alla mappatura di grandi bit di file di grandi dimensioni nel tuo spazio degli indirizzi:i sistemi a 32 bit possono facilmente non avere un unico grande spazio utilizzabile - diciamo 1G - di spazio degli indirizzi disponibile, quindi mmap fallirebbe del tutto spesso per una mappatura 1G.
Il mmap()
funzione è una chiamata POSIX. Funziona bene su MacOS X (e Linux, HP-UX, AIX e Solaris).
L'area problematica sarà Windows. Non sono sicuro che ci sia un _mmap()
chiamata nel sottosistema di "compatibilità" POSIX. È probabile che ci sia, ma avrà il nome con il trattino basso iniziale perché Microsoft ha una visione alternativa degli spazi dei nomi e considera mmap()
per intromettersi nello spazio dei nomi utente, anche se richiedi la funzionalità POSIX. È possibile trovare una definizione di un'interfaccia Windows alternativa MapViewOfFile()
e discussione sulle prestazioni in un'altra domanda SO (mmap()
vs blocchi di lettura).
Se provi a mappare file di grandi dimensioni su un sistema a 32 bit, potresti scoprire che non c'è abbastanza spazio contiguo per allocare l'intero file in memoria, quindi la mappatura della memoria fallirà. Non dare per scontato che funzionerà; decidi qual è la tua strategia di fallback se fallisce.
Considero io mappato in memoria su UNIXsas non utilizzabile per applicazioni interattive, in quanto potrebbe risultare in un SIGSEGV/SIGBUS (nel caso in cui il file sia stato troncato nel frattempo da qualche altro processo). Ignorando "soluzioni" malate come setjmp/longjmp non c'è niente si può fare altro che terminare il processo dopo aver ottenuto SIGSEGV/SIGBUS. La nuova funzionalità G++ per convertire tali segnali in eccezioni sembra essere destinata principalmente al sistema operativo Apple, poiché la descrizione afferma che è necessario il supporto runtime per questa funzionalità G++ e non è informazioni su questa funzionalità di G++ si possono trovare ovunque. Probabilmente dovremo aspettare un paio d'anni, fino a quando la gestione strutturata delle eccezioni come quella che si può trovare su Windows da più di 20 anni non si farà strada negli UNIX.