Background: sto scrivendo un programma C++ che lavora con grandi quantità di dati geografici e desidero caricare grossi pezzi da elaborare in un'unica operazione. Sono costretto a lavorare con un'app compilata per macchine a 32 bit. La macchina su cui sto eseguendo un sistema operativo a 64 bit (Windows 7) e ha 6 gig di ram. Utilizzando MS VS 2008.Quanta memoria dovresti essere in grado di allocare?
Ho il seguente codice:
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;
}
speravo che sarei stato in grado di allocare memoria fino a quando l'applicazione ha raggiunto il limite di 4 gigabyte di 32 bit di indirizzamento. Tuttavia, quando nBandBytes è 466.560.000 il nuovo lancio std :: bad_alloc al secondo tentativo. A questo punto, il valore di working set (memoria) per il processo è 665,232 K Quindi, non sembra che sia in grado di ottenere anche solo un gig di memoria allocata.
È stato menzionato un limite di 2 gig per le applicazioni in Windows a 32 bit che può essere esteso a 3 gig con l'opzione/3GB per win32. Questo è un buon consiglio in questo ambiente, ma non è pertinente in questo caso.
Quanta memoria si dovrebbe essere in grado di allocare sotto il sistema operativo a 64 bit con un'applicazione a 32 bit?
Ho trovato questo riferimento sul web: "Se si esegue come un'app a 32 bit su un sistema operativo a 64 bit, si ottiene tutto lo spazio degli indirizzi 4G e tutto ciò potrebbe essere supportato dalla memoria fisica (se si avere la RAM) anche senza usare te stessi puntatori a 64 bit. " dal blog: http://blogs.msdn.com/ricom/archive/2009/06/10/visual-studio-why-is-there-no-64-bit-version.aspx – Bill
Sulla mia macchina a 32 bit sono in grado di allocare 466.560.000 × 3 byte in test semplice. Sembra che la memoria di processo sia già frammentata nel punto di allocazione nel tuo caso. –
Ho avuto difficoltà a scegliere una risposta per contrassegnare corretta su questa domanda. Credo che la risposta sia complicata e dipende da molti fattori. I file mappati in memoria sono una buona risposta, ma la causa principale di questo problema sembra essere la frammentazione della memoria. bke1 ha sottolineato buoni strumenti per guardare la memoria, e molte persone hanno parlato della frammentazione della memoria, ma ho scelto la prima risposta che ha chiaramente indicato il problema e ha dato limiti difficili (4 Gig a 64 bit e le bandiere giuste.) – Bill