Antecedentes: estoy escribiendo un programa en C++ que trabaja con grandes cantidades de geodatos, y deseo cargar grandes fragmentos para procesar de una sola vez. Estoy obligado a trabajar con una aplicación compilada para máquinas de 32 bits. La máquina en la que estoy probando ejecuta un sistema operativo de 64 bits (Windows 7) y tiene 6 gigas de ram. El uso de MS VS 2008.¿Cuánta memoria debería poder asignar?
Tengo el siguiente código:
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;
}
Tenía la esperanza de que iba a ser capaz de asignar memoria hasta que la aplicación alcanza el límite de 4 gigabytes de 32 bits de direccionamiento. Sin embargo, cuando nBandBytes es 466,560,000, el nuevo lanza std :: bad_alloc en el segundo intento. En esta etapa, el valor del conjunto de trabajo (memoria) para el proceso es de 665,232 K. Por lo tanto, parece que no puedo obtener ni siquiera un registro de la memoria asignada.
Se mencionó un límite de 2 gigas para aplicaciones en Windows de 32 bits que puede ampliarse a 3 gigas con el modificador/3GB para win32. Este es un buen consejo en ese entorno, pero no es relevante para este caso.
¿Cuánta memoria debería poder asignar en el sistema operativo de 64 bits con una aplicación de 32 bits?
Encontré esta referencia en la web: "Si está ejecutando una aplicación de 32 bits en un sistema operativo de 64 bits, obtendrá todo el espacio de direcciones 4G y todo eso podría estar respaldado por memoria física (si tener la memoria RAM) incluso sin ti mismo usando punteros de 64 bit ". del blog: http://blogs.msdn.com/ricom/archive/2009/06/10/visual-studio-why-is-there-no-64-bit-version.aspx – Bill
En mi máquina de 32 bits, puedo asignar 466,560,000 × 3 bytes en una prueba simple. Parece que la memoria de proceso ya está fragmentada en el punto de asignación en su caso. –
Me costó mucho elegir una respuesta para marcar correctamente en esta pregunta. Creo que la respuesta es complicada y depende de muchos factores. Los archivos mapeados en memoria son una buena respuesta, pero la causa principal de este problema parece ser la fragmentación de la memoria. bke1 señaló buenas herramientas para observar la memoria, y muchas personas hablaron sobre la fragmentación de la memoria, pero elegí la primera respuesta que establecía claramente el problema y establecía límites (4 Gigas por debajo de 64 bits y las banderas correctas). – Bill