Le principe d'un fichier mappé en mémoire est assez portable, mais vous n'avez pas mmap() sous Windows (mais des choses comme MapViewOfFile() existent). Vous pouvez jeter un coup d'œil au code c des modules python mmap pour voir comment ils le font pour différentes plates-formes.
L'utilisation de mmap pour lire des fichiers n'est pas portable si vous comptez sur le mappage de gros morceaux de fichiers volumineux dans votre espace d'adressage - les systèmes 32 bits peuvent facilement ne pas avoir un seul grand espace utilisable - disons 1G - d'espace d'adressage disponible, donc mmap échouerait tout à fait souvent pour une cartographie 1G.
Le mmap()
La fonction est un appel POSIX. Cela fonctionne bien sur MacOS X (et Linux, et HP-UX, et AIX, et Solaris).
Le problème sera Windows. Je ne sais pas s'il y a un _mmap()
appel dans le sous-système "compatibilité" POSIX. Il est susceptible d'être là - mais aura le nom avec le trait de soulignement principal car Microsoft a une vue alternative sur les espaces de noms et considère mmap()
pour empiéter sur l'espace de nom d'utilisateur, même si vous demandez la fonctionnalité POSIX. Vous pouvez trouver une définition d'une interface Windows alternative MapViewOfFile()
et discussion sur les performances dans une autre question SO (mmap()
vs blocs de lecture).
Si vous essayez de mapper des fichiers volumineux sur un système 32 bits, vous constaterez peut-être qu'il n'y a pas assez d'espace contigu pour allouer l'intégralité du fichier en mémoire, de sorte que le mappage de la mémoire échouera. Ne supposez pas que cela fonctionnera; décidez quelle est votre stratégie de secours en cas d'échec.
Je considère que l'io mappé en mémoire sur UNIX n'est pas utilisable pour les applications interactives, car cela peut entraîner un SIGSEGV/SIGBUS (dans le cas où le fichier a été tronqué entre-temps par un autre processus). on peut faire autre chose que mettre fin au processus après avoir obtenu SIGSEGV/SIGBUS. La nouvelle fonctionnalité G++ pour convertir ces signaux en exceptions semble être destinée principalement au système d'exploitation Apple, puisque la description indique qu'il faut un support d'exécution pour cette fonctionnalité G++ et il n'y a pas informations à trouver sur cette fonctionnalité G++ n'importe où. Nous devrons probablement attendre quelques années, jusqu'à ce que la gestion structurée des exceptions comme celle que l'on trouve sur Windows depuis plus de 20 ans fasse son chemin dans les UNIX.