2012-08-24 2 views
3

J'ai un appel à calloc pour 1 élément d'un peu plus de 1 gigaoctet. Cet appel renvoie NULL et la vérification d'errno indique une erreur de mémoire insuffisante. Cependant, lors des tests, j'ai presque 4 Go de RAM libre, sans parler de la mémoire virtuelle disponible. Après la recherche du problème, la seule chose que je peux trouver pour pourquoi calloc échoue est que je n'ai pas assez de mémoire contiguë disponible. Cependant, il me semble que si j'ai 4Gb de mémoire disponible, il devrait être assez facile d'avoir ~ = 1Gb de mémoire contiguë. Existe-t-il un moyen de vérifier la disponibilité de la mémoire contiguë? Si c'est le problème, existe-t-il un moyen simple de "défragmenter" la mémoire?Pourquoi calloc ne parvient pas à allouer 1 Go sur un système avec 4 Go de RAM?

Ou cela a-t-il quelque chose à voir avec la taille de bloc de la mémoire allouée, de sorte qu'elle essaye réellement d'allouer beaucoup plus de mémoire que je n'ai disponible? Quelles sont mes options pour déterminer la cause de l'échec? Quelles sont mes options pour allouer avec succès autant de mémoire?

Je suis sur un système Windows natif avec 12 Go de mémoire. Ensuite, je vais essayer d'exécuter dans une machine virtuelle et de donner à la machine virtuelle plusieurs gigaoctets de mémoire, et de vérifier si la machine virtuelle peut accéder de manière non transparente à suffisamment de mémoire contiguë. Je publierai les résultats ici si je complète cela aujourd'hui.

+0

Votre fenêtre est de 32 bits, non? –

+3

Vous devez lire ceci: http://blogs.msdn.com/b/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx. Vous n'avez plus d'espace d'adressage *, ce qui n'a rien à voir avec la RAM. –

+0

@Nya Windows 64 bits (bien que la plate-forme cible pourrait être 32). – taz

Répondre

6

Une clé importante pour réussir est d'avoir 1 Go d'espace d'adressage virtuel disponible pour votre application. Avec les applications Windows 32 bits, la situation par défaut est qu'une application démarre avec essentiellement 2 Go d'espace d'adressage.

Si vous faites beaucoup d'allocations dans votre application avant celle qui échoue, il est tout à fait possible que vous ayez suffisamment découpé l'espace d'adresse d'origine pour ne pas laisser 1Go d'espace d'adressage continu. Une application ne peut exécuter que deux petites allocations «stratégiquement placées» qui diviseraient l'espace d'adressage de sorte que les portions restantes soient toutes inférieures à 1 Go.

+0

Alors, comment puis-je vérifier cela? Autre que l'échec d'un appel à calloc()? – taz

+0

Je ne sais pas comment "vérifier" pour cela. Si vous avez vraiment besoin d'un morceau de 1Go et qu'il n'y a pas d'autre moyen de le contourner, vous devriez peut-être l'allouer en premier. Si ça ne réussit pas alors, ça ne va probablement pas. Je voudrais passer à une plate-forme 64 bits, cependant. –

+4

Utilisez l'utilitaire SysInternals 'vmmap' (http://technet.microsoft.com/en-us/sysinternals/dd535533.aspx) pour afficher la carte de mémoire virtuelle d'un processus Windows. Veillez à activer l'option de menu pour afficher la mémoire libre et trier par taille et par type. –

Questions connexes