El principio de un archivo mapeado en memoria es bastante portátil, pero no tiene mmap() en Windows (pero existen cosas como MapViewOfFile()). Podría echar un vistazo al código c de los módulos mmap de python para ver cómo lo hacen para varias plataformas.
El uso de mmap para leer archivos no es portátil si confía en asignar grandes bits de archivos grandes a su espacio de direcciones:los sistemas de 32 bits pueden fácilmente no tener un solo espacio utilizable grande, digamos 1G, de espacio de direcciones disponible, por lo que mmap fallaría bastante. a menudo para un mapeo 1G.
El mmap()
La función es una llamada POSIX. Funciona bien en MacOS X (y Linux, HP-UX, AIX y Solaris).
El área del problema será Windows. No estoy seguro de si hay un _mmap()
llamada en el subsistema de 'compatibilidad' POSIX. Es probable que esté allí, pero tendrá el nombre con un guión bajo porque Microsoft tiene una vista alternativa sobre los espacios de nombres y considera mmap()
para entrometerse en el espacio del nombre de usuario, incluso si solicita la funcionalidad POSIX. Puede encontrar una definición de una interfaz de Windows alternativa MapViewOfFile()
y discusión sobre el rendimiento en otra pregunta SO (mmap()
vs bloques de lectura).
Si intenta asignar archivos grandes en un sistema de 32 bits, es posible que no haya suficiente espacio contiguo para asignar todo el archivo en la memoria, por lo que la asignación de memoria fallará. No asuma que funcionará; decide cuál es tu estrategia alternativa si falla.
Considero que el io mapeado en memoria en UNIX no se puede usar para aplicaciones interactivas, ya que puede resultar en un SIGSEGV/SIGBUS (en caso de que el archivo haya sido truncado mientras tanto por algún otro proceso). Ignorando "soluciones" tan enfermas como setjmp/longjmp no hay nada uno puede hacer otra cosa que no sea terminar el proceso después de obtener SIGSEGV/SIGBUS. La nueva función G++ para convertir dichas señales en excepciones parece estar destinada principalmente al sistema operativo Apple, ya que la descripción indica que se necesita soporte de tiempo de ejecución para esta función G++ y no hay Se puede encontrar información sobre esta característica de G++ en cualquier parte. Probablemente tengamos que esperar un par de años, hasta que se pueda encontrar un manejo de excepciones estructurado como el que se puede encontrar en Windows desde hace más de 20 años en UNIX.