De combien de mémoire devriez-vous être en mesure d'allouer?

Contexte: je suis en train d'écrire un programme C++ de travailler avec de grandes quantités de données, et souhaitez charger de gros morceaux de traiter d'un seul coup. Je suis contraint de travailler avec une application compilée en 32 bits machines. La machine que je suis en train de tester sur exécute une version 64 bits de l'OS (Windows 7) et a 6 gig de ram. À l'aide de MS VS 2008.

J'ai le code suivant:

byte* pTempBuffer2[3];
try
{
    //size_t nBufSize = nBandBytes*m_nBandCount;
    pTempBuffer2[0] = new byte[nBandBytes];
    pTempBuffer2[1] = new byte[nBandBytes];
    pTempBuffer2[2] = new byte[nBandBytes];
}
catch (std::bad_alloc)
{
    //If we didn't get the memory just don't buffer and we will get data one
    //piece at a time.
    return;
}

J'espérais que je serais en mesure d'allouer de la mémoire jusqu'à ce que l'application a atteint la limite des 4 gigaoctets de 32 bits d'adressage. Toutefois, lorsque nBandBytes est 466,560,000 les nouveaux lancers std::bad_alloc sur le deuxième essai. À ce stade, l'ensemble de travail (de mémoire) de la valeur pour le processus est 665,232 K Donc, je ne semble pas être en mesure d'obtenir même un gig de mémoire allouée.

Il y a eu une mention d'un 2 go de limite pour les applications 32 bits de Windows qui peut être étendu à 3 concert avec le commutateur /3GB pour win32. Il est de bon conseil, en vertu de cet environnement, mais pas pour ce cas.

La quantité de mémoire que vous être en mesure d'allouer en vertu de la 64 bits de l'OS avec un 32 bits?

J'ai trouvé cette référence sur le web: "Si vous êtes en cours d'exécution comme une application 32 bits application sur une version 64 bits de l'OS, puis vous obtenez l'ensemble de la 4G espace d'adressage et toutes qui pourrait être soutenu par la mémoire physique (si vous avez de la RAM), même sans l'aide de 64 bits pointeurs de vous-même.", le blog : blogs.msdn.com/ricom/archive/2009/06/10/...
Sur ma machine 32 bits, je suis en mesure d'allouer 466,560,000×3 octets de test simple. Semblent être la mémoire de processus déjà fragmentée à l'allocation point dans votre cas.
J'ai eu un moment difficile de la sélection d'une réponse à la marque correcte sur cette question. Je crois que la réponse est complexe et dépend de nombreux facteurs. Les fichiers mappés en mémoire sont une bonne réponse, mais la cause de ce problème semble être une fragmentation de la mémoire. bke1 a souligné les bons outils pour la recherche sur la mémoire, et beaucoup de personnes ont parlé de la fragmentation de la mémoire, mais je l'ai choisi la première réponse qui indiquaient clairement le problème et a donné des limites dures (4 Gig de moins de 64 bits et le droit des drapeaux.)
Merci à tous, et merci en particulier pour les liens vers des articles très.
D'autres tests révèle ceci: j'ai essayé d'allouer de la ram dans de 3000 morceaux, et il a échoué à environ 95% du chemin. Beaucoup plus proche de l'achèvement de le faire en 3 morceaux, mais toujours pas de chance. Le VMMap outil signalé que j'avais 1.4 Gig d'espace libre, mais encore dans de 3000 morceaux, je ne pouvais pas affecter 1,3 Concert. Aller de l'avant sur ce problème, je vais essayer les fichiers mappés en mémoire.

OriginalL'auteur Bill | 2009-06-23