Ho lavorato per cercare di capire perché il mio programma sta consumando così tanta RAM di sistema. Sto caricando un file dal disco in un vettore di strutture di diversi array allocati dinamicamente. Un file da 16 MB finisce per consumare 280 MB di RAM di sistema in base al task manager. I tipi nel file sono principalmente caratteri con alcuni corti e alcuni lunghi. Ci sono 331.000 record nel file che contengono in media circa 5 campi. Ho convertito il vettore in una struttura e questo ha ridotto la memoria a circa 255 MB, ma sembra ancora molto alto. Con il vettore che occupa tanta memoria, il programma sta esaurendo la memoria, quindi ho bisogno di trovare un modo per ottenere un uso più ragionevole della memoria.Perché un programma VC++ che memorizza 5 MB di dati consuma 64 MB di memoria di sistema?
Ho scritto un semplice programma per inserire semplicemente un vettore (o array) con 1.000.000 puntatori di caratteri. Mi aspetto di allocare 4 + 1 byte per ognuno dei 5 MB di memoria necessari per l'archiviazione, ma in realtà utilizza 64 MB (versione array) o 67 MB (versione vettoriale). Quando il programma si avvia per la prima volta, consuma solo 400 K, quindi perché è disponibile un ulteriore 59 MB per array o 62 MB per i vettori allocati? Questa memoria extra sembra essere per ogni contenitore, quindi se creo un size_check2 e copio tutto ed eseguo il programma usa 135 MB per 10 MB di indicatori e dati.
Grazie in anticipo,
size_check.h
#pragma once
#include <vector>
class size_check
{
public:
size_check(void);
~size_check(void);
typedef unsigned long size_type;
void stuff_me(unsigned int howMany);
private:
size_type** package;
// std::vector<size_type*> package;
size_type* me;
};
size_check.cpp
#include "size_check.h"
size_check::size_check(void)
{
}
size_check::~size_check(void)
{
}
void size_check::stuff_me(unsigned int howMany)
{
package = new size_type*[howMany];
for(unsigned int i = 0; i < howMany; ++i)
{
size_type *me = new size_type;
*me = 33;
package[i] = me;
// package.push_back(me);
}
}
main.cpp #include "size_check.h"
int main(int argc, char * argv[ ])
{
const unsigned int buckets = 20;
const unsigned int size = 50000;
size_check* me[buckets];
for(unsigned int i = 0; i < buckets; ++i)
{
me[i] = new size_check();
me[i]->stuff_me(size);
}
printf("done.\n");
}
non ho letto il codice in dettaglio, ma tenere a mente che i puntatori occupano spazio troppo. – slartibartfast
È inoltre necessario prendere in considerazione l'allineamento e il riempimento della struttura dei dati. – feathj
@myrkos è corretto - quattro byte, se non ricordo male, su hardware comune. Anche le definizioni della tua classe prendono spazio. Prova a fare un sizeof() di un oggetto size_check che crei, e moltiplicalo per il numero di istanze che crei, e vedi se questo non fa la differenza. –