begin process at 2008 05 17 12:31:05
1 173 994 membres
116 nouveaux aujourd'hui
13 974 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : split qui plante [ Algorithme / Compression, Split et Cryptage ] (tibo76530)

split qui plante le 05/05/2008 14:43:03

tibo76530
bonjour
je viens demander de l'aide car je planche sur un probleme de puis quelques jours, et je n'arrive pas à m'en sortir.
voila: je vais récupérer des données dans un fichier .txt. je récupère cela dans un streamreader que je lis ensuite ligne par ligne.
ensuite, je traite chaque ligne avec mon split afin de récupérer les différents champs contenus dedans.
mon problème est que le traitement est très lent, sans raison apparente. mon appli tombe en rade à partir de 2000 lignes à traiter, ce qui n'est vraiment ^pas beaucoup.
Si quelqu'un a une idée, je suis preneur. me demander si l'on veut mon code
tibo
PS: je ne savais pas dans quel rubrique poster, alors je l'ai mis la, du au Split dans le titre de la rubrique.

Re : split qui plante le 05/05/2008 15:12:06

SharpMao
Membre Club
Réponse acceptée !
Hello,

Il faudra sans doute que tu mettes ton code,ou du moins, au moins la boucle qui fait le traitement, pour qu'on puisse t'aider. Difficile de faire mieux snas voir le code.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)

Re : split qui plante le 05/05/2008 15:26:28

tibo76530
voici la partie de code ou je pense que ca plante:

StreamReader sr = newStreamReader(nom);

String ligne = sr.ReadLine();

while (ligne != null)

{

String[] temp = ligne.Split('|');

for (int i = 0; i < temp.Length; i++)

{

// textBox3.Text= textBox3.Text + temp[i].ToString()+" ";

}

//textBox3.Text = textBox3.Text + "\r\n";

ligne = sr.ReadLine();

}

// Fermeture du StreamReader (attention très important)

sr.Close();






merci d'avance


Re : split qui plante le 06/05/2008 08:32:49

SharpMao
Membre Club
Réponse acceptée !
Hello,
A mon avis, le problème ne vient ni du split, ni de la lecture du fichier.
J'ai essayer le bout de code que tu as mis, et avec un fichier de 100'000 lignes formatté comme suit :
1|2|3|4
2|4|6|8
3|6|9|12

Il me faut moins de 0.1 seconde pour exécuter ce code.
Si par contre, je rajoute
string s =""; //à l'extérieur du while
et
s+= temp[i] +" ";//dans la boucle for. Inutile de faire un .ToString, temp[i] est déjà un string.
et
s+= Environment.NewLine; // après la boucle for

Avec ça, le temps de traitement monte à presque 20 minutes !

Par contre, si j'utilise un StringBuilder (dans l'assembly System.Text)
StringBuilder sb =new StringBuilder();//à l'extérieur du while

s.AppendFormat("{0} ", temp[i]);//dans la boucle for
et
sb.AppendLine();// après la boucle for

Avec ça, le temps de traitement n'est plus que de 0.2 secondes !!

Mais attend, on peut faire encore mieux :
Si ton but est de récupérer tout le texte de ton fichier dans un string ou les '|' sont remplacés par des ' ', tu fais ça en une ligne :

string s = File.ReadAllText(nom).Replace('|', ' ');

 Temps de rtaitement : inférieur à 0.05 secondes, toujours pour un fichier de 100'000 lignes !!!


Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)


Re : split qui plante le 06/05/2008 08:36:04

SharpMao
Membre Club
Réponse acceptée !
Encore une chose,

C'est très bien de mettre un sr.Close, mais si pour une raison ou une autre, ton code génère une exception, ton fichier ne sera pas fermé.
Tu pourrais mettre un try...catch...finally, mais le plus simple, est d'utiliser le met clé using :

using (StreamReader sr = new StreamReader(nom))
{
//Fait ce que tu dois faire ave ton sr, à la fin du using, il sera libéré !
}


Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)


Re : split qui plante le 06/05/2008 09:26:36

tibo76530
hello sharpmao
je n'ai  pas mis tout le code, mais j'avais déjà mis un try catch .
sinon, merci de t'etre penché sur mon probleme. je vais essayer de corriger mon code avec tes conseils.
je te dirai ensuite comment je m'en suis sorti.
dans tous les cas, merci !

Re : split qui plante le 06/05/2008 10:06:27

tibo76530
bon, je viens de modifier mon code et j'ai fait des tests par rapport à tes conseils. ca marche très bien.
merci encore pour tes tuyaux. le plantage devait venir de la concaténation de String, non?

Re : split qui plante le 06/05/2008 10:41:30

SharpMao
Membre Club
Réponse acceptée !
Hello,

Oui, le problème veanit bien de la concaténation de string.
Désolé de dire ça comme ça, mais ton problème est presque l'exemple parfait de ce qu'il faut éviter avec les string.

A chaque fois que tu fais s+= " ";
il recrée un nouveau string contenant la nouvelle valeur. c'est la répétion de cette création qui devient de plus en plus gourmade en resources.
Avec un StringBuilder, il gère la taille de manière dynamique, et on le voit avec les temps que je t'ai donné, de manière efficace.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)

Re : split qui plante le 09/05/2008 00:08:29

coq
(Admin CS)
Réponse acceptée !
Salut,

Si besoin d'une façon imagée de représenter la chose : http://blogs.codes-sources.com/coq/archive/2007/07/28/un-bon-moyen-de-se-souvenir-de-l-ami-stringbuilder.aspx
;-)


/*
coq
MVP Visual C#
CoqBlog
*/

Re : split qui plante le 14/05/2008 11:26:23

tibo76530

re-bonjour à tous.
finalement, je dois afficher mes info dans une autre form, sous forme d'un datagrid view.
malheureusement, j'ai de nouveau des problemes de temps d'executions. je suis en train de chercher, mais je ne vois pas pour le moment.

voici mon code:

form = new Form();
               
                DataGridView dtg1 = new DataGridView();
                dtg1.Size = new System.Drawing.Size(1000, 400);
              
               
               
                /* On recupère le texte complet du fichier */
                if (fi.Exists) // on verifie que le fichier existe
                {
                  
                       using( StreamReader sr = new StreamReader(nom)){
                        String ligne = sr.ReadLine();
                       
                        while (ligne != null)
                        {
                            String[] temp = ligne.Split('|');
                            //dtg1.AutoResizeRows();
                            dtg1.Rows.Add();
                            for(int i=0;i<temp.Length-1;i++)
                           {
                                dtg1.Rows[j].Cells[i].Value = temp[i];
 
                            }
                          
                           
                            ligne = sr.ReadLine();
                        }
                       
                        form.Controls.Add(dtg1);

                        form.Show();
                    }
               

merci d'avance!



Classé sous : ligne, récupérer, demander, split, plante

Participer à cet échange

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS