2009-04-07 9 views
23

Qu'est-ce qui limite la taille d'un fichier mappé en mémoire? Je sais qu'il ne peut pas être plus grand que le plus gros morceau continu d'espace d'adressage non alloué, et qu'il devrait y avoir assez d'espace disque libre. Mais y a-t-il d'autres limites?Quelle est la taille maximale d'un fichier mappé en mémoire?

+0

Plate-forme? Windows ou Linux? –

Répondre

24

Vous êtes trop conservateur: un fichier mappé en mémoire peut être plus grand que l'espace d'adressage. Le afficher du fichier mappé en mémoire est limité par les contraintes de mémoire du système d'exploitation, mais c'est seulement la partie du fichier que vous regardez en même temps. (Et techniquement, vous pouvez mapper plusieurs vues de parties discontinues du fichier à la fois, donc en dehors des contraintes de surcharge et de longueur de page, c'est seulement le nombre total d'octets que vous regardez qui pose une limite. [0 à 1024] et [2 octets à 2 + 1024] avec deux vues séparées.)

Dans MS Windows, regardez la fonction MapViewOfFile. Il prend effectivement un décalage de fichier de 64 bits et une longueur de 32 bits.

+0

Oui, j'aurais dû dire "voir". J'ai besoin d'avoir accès à tout le fichier en une fois, sans re-mmapp() ing. – user88185

+0

MapViewOfFile prend une longueur de 64 bits sur une machine 64 bits – springy76

+0

une toute façon on peut passer à zéro pour une taille qui signifie « aussi grand que le fichier est » –

1

Il ne devrait pas y avoir d'autres limites. Ne sont-ils pas assez? ;-)

+0

Sur un système d'exploitation 64 bits ces limites semblent assez laxistes ... – user88185

1

Sous Windows: « La taille d'une vue de fichier est limité au plus grand bloc contigu de mémoire disponible virtuelle sans réserves Ceci est au plus 2 Go moins la mémoire virtuelle déjà réservée par le processus. ».

De MDSN.

Je ne suis pas sûr de LINUX/OSX/Quelle que soit d'autre, mais il est probablement aussi lié à l'espace d'adressage.

+1

juste pour clarifier, c'est la taille d'une vue de fichier, pas la taille du fichier lui-même. –

+5

"2 Go moins la mémoire virtuelle déjà réservée par le processus" est sur la machine 32 bits? Est-ce différent sur une boîte de 64 bits? – user88185

0

Avec FUSE sur Linux, vous pouvez aussi faire un système de fichiers en mémoire qui étend sur le disque sur demande. Je ne suis pas sûr que cela se qualifie comme mémoire mappée, et la distinction devient un peu floue.

-3

entrée de Wikipedia sur le sujet: http://en.wikipedia.org/wiki/Memory-mapped_file

+0

Je ne vois pas d'autres limites mentionnées dans cet article de Wikipedia, est-ce que cela signifie que il n'y en a pas? – user88185

+1

Alors que cela peut théoriquement répondre à la question, [il serait préférable] (http: //meta.stackoverflow.com/q/8259) pour inclure les parties essentielles de la réponse ici, et fournir le lien pour référence. –

9

Cela a été mon expérience lors de l'utilisation des fichiers mappés en mémoire sous Win32:

Si votre carte le fichier entier dans un segment, il puise normalement autour de 750 Mo, car il ne peut pas trouver un plus grand bloc de mémoire contigu. Si vous le divisez en segments plus petits, disons 100 Mo chacun, vous pouvez obtenir environ 1500 Mo-1800 Mo en fonction de ce qui est en cours d'exécution.

Si vous utilisez le /3g switch vous pouvez obtenir plus de 2 Go jusqu'à environ 2700MB mais les performances du système d'exploitation est pénalisé.

Je ne suis pas sûr de 64 bits, je ne l'ai jamais essayé mais je présume la taille du fichier max est alors limitée que par la quantité de mémoire physique que vous avez.

+0

Sur 64 bits, la limite est l'espace d'adressage disponible, identique à celui de 32 bits. Vous pouvez mapper une vue 1 Go sur une machine 32 bits qui a seulement 32 Mo de mémoire physique. De la même manière, vous pouvez mapper une vue de 10 To sur une machine 32 bits qui ne dispose que de 0,5 Go de mémoire. Seules les pages de 4 Ko que vous avez vraiment accès sont mappées dans la mémoire réelle. – springy76

+1

@ springy76: vous ne pouvez pas mapper une vue de 10 To sur une machine 32 bits. Seulement sur 64 bits. –

+4

@SergeyK. tu as raison, c'est aussi ce que je voulais écrire - mais mes doigts ont tapé autre chose. Il aurait dû lire "De la même façon que vous pouvez mapper une vue de 10 To sur une machine 64 bits qui a seulement 0,5 Go de mémoire" – springy76

Questions connexes