2016-12-22 2 views
1

J'essaie de travailler avec un fichier de données plus grand que ma mémoire.Comment un fichier mappé en mémoire fonctionne-t-il pour des fichiers plus volumineux que la mémoire?

Ma compréhension jusqu'ici est qu'il mappe chaque octet dans le fichier à une adresse dans la mémoire virtuelle. Les données ne sont lues dans la mémoire réelle que lorsque vous en avez réellement besoin (par exemple en accédant à une entrée spécifique), et elles sont lues en morceaux appelés pages.

Mais si je finis par tout traiter dans ce fichier de données, cela ne signifie-t-il pas que tout doit être lu dans la mémoire réelle? Le système d'exploitation décide-t-il automatiquement quelles parties des données déjà en mémoire doivent être libérées pour faire de la place pour des données supplémentaires?

Pour ce projet spécifique, je travaille avec Python sous Linux si cela fait une différence. numpy.memmap

+0

Plus grande que la mémoire physique disponible ou plus grande que l'espace d'adressage virtuel disponible? –

Répondre

1

Cela dépend. Les fichiers mappés en mémoire fonctionnent presque exactement de la même manière que les fichiers paging classiques, sauf qu'au lieu de déplacer des données entre la mémoire et le fichier d'échange, le système d'exploitation déplace les données entre la mémoire et un fichier arbitraire spécifié. Donc, si vous n'avez plus de mémoire physique (c'est-à-dire les puces RAM réelles que vous avez sur votre carte mère), c'est bien. Le système d'exploitation ne fera que feuilleter toutes les parties du fichier qu'il pense ne pas utiliser. Si cela vous semble faux, vos performances seront médiocres, mais vous ne risquez pas de planter ou quoi que ce soit.

Mais si vous avez épuisé mémoire virtuelle, ou l'espace d'adressage, ce n'est pas bien. Dans ce cas, votre programme manque d'adresses mémoire et ne pourra plus allouer de mémoire. Vous serez également incapable de développer la région mappée en mémoire du fichier. Pour un programme 32 bits, la limite est légèrement inférieure à 4 Go (la limite précise varie en fonction du système d'exploitation et de l'environnement de programmation, et dépend de la surcharge de ces systèmes). Pour un programme 64 bits, la limite est normalement énorme, bien que l'ampleur dépendra de votre architecture et de votre système d'exploitation.