J'implémente de grands tableaux constants persistants via mmap. Y a-t-il des trucs et astuces ou des astuces à connaître lors de l'utilisation de mmap?mmaping de gros fichiers (pour les grands tableaux persistants)
Répondre
Tous les pointeurs qui sont stockés à l'intérieur de la région mmap'd doivent être effectués comme des décalages de la base de la région mmap'd, pas comme de vrais pointeurs! Vous n'obtiendrez pas nécessairement la même adresse de base lorsque vous appliquez la région à la prochaine exécution du programme. (J'ai dû nettoyer le code qui a fait des suppositions incorrectes sur la constance de l'adresse de base de la région mmap).
Assurez-vous de vérifier les restrictions sur la taille des fichiers ouverts ou l'utilisation de la mémoire. Sous Linux, il y a une commande shell intégrée ulimit. Exécuter comme ulimit -a
pour voir les paramètres actuels.
Vider écrit dans le tableau en mémoire avec le msync (2) syscall ou ils peuvent rester en mémoire jusqu'à munmap (2) et il peut y avoir une panne de courant ou quelque chose avant!
Si plusieurs processus appliquent la même zone de mémoire partagée avec des droits de lecture et d'écriture, assurez-vous qu'un seul écrit à la fois pour éviter de corrompre vos données. Ou utilisez le verrouillage de fichier ou d'autres moyens de synchronisation.
Ceci est le cas d'utilisation le plus simple pour mmap(), donc il ne devrait pas y avoir beaucoup de choses à vous trébucher.
Vous chargez simplement un grand réseau constant. Étant constantes, vous ne devriez pas avoir à vous soucier de la synchronisation. Il est conseillé de vous assurer que le paramètre prot est défini sur PROT_READ uniquement car vous n'écrivez pas.
Si un ou plusieurs programmes utilisant les constantes doivent être exécutés en continu, il peut être utile d'avoir un programme distinct qui charge les données et les maintient en mémoire. Les exécutions des autres programmes effectuent alors essentiellement une mémoire partagée plutôt que de lire continuellement le fichier en mémoire.
Le rinçage n'est pas nécessaire car les données sont constantes. –