2015-12-12 2 views
0

J'ai écrit des données dans un fichier de la manière suivante:Les données lues à partir du fichier prend beaucoup plus de mémoire que la taille du fichier

result = new QHash<QPair<int, int>, QVector<double> >; 
QFile resfile("result.txt"); 
resfile.open(QIODevice::WriteOnly | QIODevice::Append); 
QDataStream out(&resfile); 
while(condition) 
{ 
QString s=" something"; 
out<<s; 
res->insert(QPair<int, int>(arange,trange),coeffs); 
out<<res; 
} 

Le fichier a fini avec l'égal à 484MB. Après que je l'ai lu dans une boucle:

QString s; 
QVector<QHash<QPair<int, int>, QVector <double> > > thickeness_result; 
QFile resfile("result.txt"); 
resfile.open(QIODevice::ReadOnly); 
QDataStream out(&resfile); 
while (!out.atEnd()) 
{ 
thickeness_result.resize(thickeness_result.size()+1); 
out>>s>>thickness_result.last(); 
} 

Bien que cette lecture en boucle est en cours d'exécution, je vois que dans le gestionnaire de tâches de mon programme commence à prendre à propos de 1300 Mo chacune de la mémoire et après que je reçois un « dans le texte fichier \ qharfbuzzng .cpp, ligne 626: Erreur de mémoire insuffisante. Ma question est: Est-il normal que le programme commence à prendre plus de 2 fois la taille de la mémoire de fichier et que je devrais le lire en morceaux ou est-ce que je fais quelque chose de mal?

Répondre

0

AVERTISSEMENT Tout ce qui suit suppose que QVector se comporte comme std::vector

Oui, il est normal. Qu'est-ce qui se passe est que lorsque vous avez 1024 éléments, et que vous voulez en lire un autre, l'appel à resize alloue la capacité pour 2048 éléments, en déplaçant les 1024 premiers éléments, puis en construisant le 1025e élément. Il détruit l'ancien tableau et renvoie la mémoire au tas (mais pas au système d'exploitation). Puis quand vous venez de lire le 2049ème élément, il le fait encore une fois, seulement cette fois en allouant 4096 éléments. Le tas a un espace de 1024 éléments, mais ce n'est pas utile quand vous voulez 4096. Maintenant vous avez des blocs de 1024, 2048 et 4096 éléments dans le tas (dont deux sont gratuits et disponibles pour être réutilisés).

Répétez jusqu'à ce que vous ayez lu le fichier. Vous verrez que vous vous retrouvez avec (environ) deux fois la taille du fichier. La première règle est "ne vous inquiétez pas à ce sujet" - ce n'est généralement pas un problème. Cependant, pour vous, c'est clairement.

Pouvez-vous basculer vers un programme 64 bits? Cela devrait faire disparaître le problème.

L'autre option consiste à deviner combien d'éléments vous avez (à partir de la taille du fichier) et d'appeler .reserve sur le vecteur au début.

+0

Merci pour votre explication! Je vais essayer de trouver un workarond =) – pr0r1der

+0

La réservation n'aide pas tristement. – pr0r1der

+0

Dans ce cas, vous avez le choix entre: convertir en 64 bits; lire en morceaux. –