Une application qui fige lors d'un évènement sur la frame.
Bonjour tout le monde,
Je vais essayer de faire simple.
Je développe une application sous wx-Devcpp.
Objectif: rechercher des doublons de lignes dans un fichier de type csv.
Voilà à quoi ressemble le fichier de données:
Citation:
NOM;PRENOM;N°SECU;n°RUE;nom RUE;VILLE
Someone;Jonathan;123456789012345;13;rue de l'étang;Ici
Somebody;Sébastien;123456789012344;1;avenue les bains;Là bas
Someone;Jonathan;123456789012345;13;rue de l'étang;Ici
Dans le cas actuel, le fichier en question est ouvert, lu et stocké intégralement dans un buffer alloué dynamiquement.
Ensuite, pour l'instant, l'application parcourt linéairement le buffer caractère par caractère à la recherche du champ le plus long.
La taille du fichier à analyser semble être un obstacle:
Avec un petit fichier de test, tout se passe bien.
A partir d'environ 1Mo, l'application se met à fortement ralentir, et si par malheur la fenêtre perd le focus ou est déplacée, celle ci fige et ne répond
plus. :aie:
L'application fige également au bout d'un certain temps.
Pensez vous qu'il soit bien de stocker tout un fichier en mémoire pour travailler avec le contenu ?
(celui-ci pourra atteindre au maximum 50Mo) ?
Merci d'avance pour votre aide.
Application développée en wx-Devcpp qui fige
Bonjour, me revoilà!
J'ai résolu une partie de mon problème en faisant une allocation dynamique de mémoire en utilisant new et delete plutôt que malloc et free.
Le positif: l'application réussit maintenant à balayer tout le fichier sans se bloquer.
Le négatif: Lorsque celle ci est en cours et parcourt le fichier, ne surtout pas cliquer sur sa fenêtre, tenter de la déplacer ou même faire autre chose comme aller par exemple lire ses mails: celle ci fige et y apparait en haut à gauche "ne répond pas".
Vous avez une idée?
Pour info, c'est à l'éxecution de cette boucle qui peut durer très longtemps (dépend de la taille du fichier) que survient le problème.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
field_len=0;
longest_field=0;
for (i=0;i<(int)strlen(buffer);i++)
{
// si la donnée n'est pas un délimiteur
if (buffer[i]!=';' && buffer[i]!='\n')
field_len++;
else // alors fin du champ n°X
{
if (field_len > longest_field)
longest_field = field_len;
field_len=0;
}
aze++;
if (aze>9)
{
wxLogStatus("Lu %d / %d", i, (int)strlen(buffer) );
aze=0;
}
}
wxLogMessage("champ le plus grand vaut %d caracteres", longest_field); |
Merci à vous koala01 et Mongaulois pour vos réponses.
(Dès que ce bug sera résolu, je passerai à l'étape stockage des données)