Précédent   Forum du club des développeurs et IT Pro > Dotnet > Langages > C#
C# Forum d'entraide sur la programmation C#. Avant de poster -> FAQ C#, Articles C#, Sources C#
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/12/2012, 13h21   #1
FoxDeltaSierra
Membre du Club
 
Inscription : novembre 2004
Messages : 244
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 244
Points : 60
Points : 60
Envoyer un message via MSN à FoxDeltaSierra
Par défaut Problème lecture fichier TXT de 2500 lignes, et timeout server

Bonjour à tous,

Je suis en train de développer une application ASP.net C# qui lit un fichier TXT en ligne, qui contient des coordonnées GPS sur chaque ligne.

Je le converti ensuite en une chaîne encodée Polyline Google pour afficher le tracé GPS sur une carte Google Map. Ca fonctionne à merveille pour des petits fichiers (100/200 lignes), mais le temps de réponse augmente avec les lignes, et je ne peux pas lire de gros fichiers... comment faire ?

Le message d'erreur du serveur :

Citation:
The following error occurred:

Timeout waiting for Web Server to respond to request.
The response exceeded the timeout interval: 40 Seconds.

This means that:

Acceleration Server did not get a response back from the webserver before the timeout interval passed.
Confirm that the address is correct.
Confirm that the host is reachable and online.
Merci d'avance.
__________________
Vive Visual Studio.net !!!
FoxDeltaSierra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 13h59   #2
ElTotor
Membre confirmé
 
Homme François DORIN
Chef de Projet
Inscription : décembre 2012
Messages : 104
Détails du profil
Informations personnelles :
Nom : Homme François DORIN
Localisation : France, Vienne (Poitou Charente)

Informations professionnelles :
Activité : Chef de Projet
Secteur : Associations - ONG

Informations forums :
Inscription : décembre 2012
Messages : 104
Points : 226
Points : 226
Bonjour,

Avoir le code que tu utilises permettrait peut être de t'aider à voir pourquoi cela devient lent.

Ensuite, peut être que paralléliser les calculs permettraient de diminuer les temps de réponse (par exemple, avec Parallel.ForEach)
ElTotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 14h38   #3
FoxDeltaSierra
Membre du Club
 
Inscription : novembre 2004
Messages : 244
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 244
Points : 60
Points : 60
Envoyer un message via MSN à FoxDeltaSierra
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 scriptString = "";
 
            List<GoogleAPI.Coordinate> Liste = new List<GoogleAPI.Coordinate>();
            GoogleAPI.Coordinate Point = new GoogleAPI.Coordinate();
 
            // Création d'une instance de StreamReader pour permettre la lecture de notre fichier 
            StreamReader monStreamReader = new StreamReader(Server.MapPath(fichier));
            string ligne = monStreamReader.ReadLine();
 
            string Degres = "";
            string Minutes = "";
            string Secondes = "";
 
            double Lat, Lng;
 
            while (ligne != null)
            {
 
                    try
                    {
                        if (ligne.Substring(0, 1) == "B")
                        {
                            Degres = ligne.Substring(7, 2);
                            Minutes = ligne.Substring(9, 2);
                            Secondes = ligne.Substring(11, 3);
 
 
 
                            Lat = double.Parse(Degres) + (double.Parse(Minutes) / 60.000) + (double.Parse(Secondes) * 60 / 1000 / 3600.000);
 
                            if (ligne.Substring(14, 1) == "S") Lat = -Lat;
 
                            Lat = Math.Round(Lat, 6);
 
                            //scriptString += Degres + " " + Minutes + " " + Secondes + "   -->    "+Lat+"                  /                   ";
 
                            Degres = ligne.Substring(15, 3);
                            Minutes = ligne.Substring(18, 2);
                            Secondes = ligne.Substring(20, 3);
 
                            Lng = double.Parse(Degres) + (double.Parse(Minutes) / 60.000) + (double.Parse(Secondes) * 60 / 1000 / 3600.000);
                            Lng = Math.Round(Lng, 6);
                            if (ligne.Substring(23, 1) == "W") Lng = -Lng;
 
                            //scriptString += Degres+" "+Minutes+" "+Secondes + "  -> "+Lng+"\n";
 
                            Point.Latitude = Lat;
                            Point.Longitude = Lng;
                            Liste.Add(Point);
                        }
                        ligne = monStreamReader.ReadLine();
 
 
                    }
                    catch
                    {
                    }
 
            }
 
                        scriptString = GoogleAPI.EncodeCoordinates(Liste);
 
            // Fermeture du StreamReader (attention très important) 
            monStreamReader.Close();
En gros, on lit les lignes une par une, on récupère les coordonnées GPS que l'on converti et que l'on ajoute dans la liste List<>. Enfin, on renvoi le tracé GPS codé dans scriptString
__________________
Vive Visual Studio.net !!!
FoxDeltaSierra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 15h05   #4
ElTotor
Membre confirmé
 
Homme François DORIN
Chef de Projet
Inscription : décembre 2012
Messages : 104
Détails du profil
Informations personnelles :
Nom : Homme François DORIN
Localisation : France, Vienne (Poitou Charente)

Informations professionnelles :
Activité : Chef de Projet
Secteur : Associations - ONG

Informations forums :
Inscription : décembre 2012
Messages : 104
Points : 226
Points : 226
Quelle est la partie qui prend du temps ? Est-ce l'appel à l'API Google (GoogleAPI.EncodeCoordinates(Liste)) ? Ou est-ce la constitution de la liste ?
ElTotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 15h27   #5
FoxDeltaSierra
Membre du Club
 
Inscription : novembre 2004
Messages : 244
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 244
Points : 60
Points : 60
Envoyer un message via MSN à FoxDeltaSierra
C'est la constitution de la liste (2500 passages dans le While).
__________________
Vive Visual Studio.net !!!
FoxDeltaSierra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 15h37   #6
ElTotor
Membre confirmé
 
Homme François DORIN
Chef de Projet
Inscription : décembre 2012
Messages : 104
Détails du profil
Informations personnelles :
Nom : Homme François DORIN
Localisation : France, Vienne (Poitou Charente)

Informations professionnelles :
Activité : Chef de Projet
Secteur : Associations - ONG

Informations forums :
Inscription : décembre 2012
Messages : 104
Points : 226
Points : 226
Je ne vois pourtant rien qui expliquerait cela. Peut être que le StreamReader est lent à l'utilisation !

Si éventuellement tu as la possibilité de mettre à disposition un petit fichier d'exemple pour faire quelques tests... Enfin, quand je dis petit, un gros fichier de 2500 lignes ^^
ElTotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 15h44   #7
FoxDeltaSierra
Membre du Club
 
Inscription : novembre 2004
Messages : 244
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 244
Points : 60
Points : 60
Envoyer un message via MSN à FoxDeltaSierra
Oui Ici : http://www.netcoupe.net/Download/Dow...x?FileID=38616
__________________
Vive Visual Studio.net !!!
FoxDeltaSierra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 15h59   #8
ElTotor
Membre confirmé
 
Homme François DORIN
Chef de Projet
Inscription : décembre 2012
Messages : 104
Détails du profil
Informations personnelles :
Nom : Homme François DORIN
Localisation : France, Vienne (Poitou Charente)

Informations professionnelles :
Activité : Chef de Projet
Secteur : Associations - ONG

Informations forums :
Inscription : décembre 2012
Messages : 104
Points : 226
Points : 226
Merci,

Je viens de tester, en remplaçant les GoogleAPI.Coordinate par des System.Drawing.PointF, et c'est instantanné ! Et la liste finale contient plus de 8000 éléments.

Donc comme ça, je ne vois pas d'où vient le problème que tu rencontres, si ce n'est que ce n'est pas a priori un problème lié au parsing du fichier.
ElTotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 17h22   #9
ElTotor
Membre confirmé
 
Homme François DORIN
Chef de Projet
Inscription : décembre 2012
Messages : 104
Détails du profil
Informations personnelles :
Nom : Homme François DORIN
Localisation : France, Vienne (Poitou Charente)

Informations professionnelles :
Activité : Chef de Projet
Secteur : Associations - ONG

Informations forums :
Inscription : décembre 2012
Messages : 104
Points : 226
Points : 226
Les ralentissements sont peut être dus à l'API Google (je pense notamment à GoogleApi.Coordinate). Est-ce qu'elles sont disponibles gratuitement ? Je n'ai pas réussi à les trouver sur le net (je ne trouve que des API javascripts).

Car peut être que l'assignation de la longitude et/ou latitude nécessite des calculs qui peuvent expliquer tes timeouts...
ElTotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 17h48   #10
FoxDeltaSierra
Membre du Club
 
Inscription : novembre 2004
Messages : 244
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 244
Points : 60
Points : 60
Envoyer un message via MSN à FoxDeltaSierra
C'est étrange... je viens aussi d'essayer en local, et c'est pareil c'est instantané. Dès que je publie ca en ligne, ca rame et donc ca plante... même avec ta technique du PointF. Une idée ?
__________________
Vive Visual Studio.net !!!
FoxDeltaSierra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 18h24   #11
ElTotor
Membre confirmé
 
Homme François DORIN
Chef de Projet
Inscription : décembre 2012
Messages : 104
Détails du profil
Informations personnelles :
Nom : Homme François DORIN
Localisation : France, Vienne (Poitou Charente)

Informations professionnelles :
Activité : Chef de Projet
Secteur : Associations - ONG

Informations forums :
Inscription : décembre 2012
Messages : 104
Points : 226
Points : 226
La seule idée qui me vient pour le moment, c'est que ton fichier n'est pas sur un disque local mais un disque réseau.

Sinon, c'est que la dernière ligne (scriptString = GoogleAPI.EncodeCoordinates(Liste)) où doit se cacher un appel à un webservice plante dans un timeout. Est-ce que tu es sur que l'erreur ne vient pas de là ? Que se passe-t-il si tu enlèves cette ligne et que tu renvoies une valeur par défaut ??
ElTotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 20h35   #12
FoxDeltaSierra
Membre du Club
 
Inscription : novembre 2004
Messages : 244
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 244
Points : 60
Points : 60
Envoyer un message via MSN à FoxDeltaSierra
Le GoogleAPI n'est pas un webserveur mais un fichier code qui se trouve bien dans mon appli dans le dossier App_Code.

De toutes façons ca ne vient pas de lui, j'ai testé en affichant uniquement le nombre de lignes lues : en local ca fonctionne très bien, sur le réseau non. voici le code de ma page :

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
    protected void Page_Load(object sender, EventArgs e)
    {
 
        string fichier = "~/Pro/GPS_Files/1011.igc";
 
        string scriptString;
 
        try
        {
            scriptString = "";
 
            List<System.Drawing.PointF> Liste = new List<System.Drawing.PointF>();
            System.Drawing.PointF Point = new System.Drawing.PointF();
 
            // Création d'une instance de StreamReader pour permettre la lecture de notre fichier 
            StreamReader monStreamReader = new StreamReader(Server.MapPath(fichier));
            string ligne = monStreamReader.ReadLine();
 
            string Degres = "";
            string Minutes = "";
            string Secondes = "";
 
            double Lat, Lng;
 
 
            // Lecture de toutes les lignes et affichage de chacune sur la page 
            while (ligne != null)
            {
 
                try
                {
                    if (ligne.Substring(0, 1) == "B")
                    {
                        Degres = ligne.Substring(7, 2);
                        Minutes = ligne.Substring(9, 2);
                        Secondes = ligne.Substring(11, 3);
 
 
 
                        Lat = double.Parse(Degres) + (double.Parse(Minutes) / 60.000) + (double.Parse(Secondes) * 60 / 1000 / 3600.000);
 
                        if (ligne.Substring(14, 1) == "S") Lat = -Lat;
 
                        Lat = Math.Round(Lat, 6);
 
                        //scriptString += Degres + " " + Minutes + " " + Secondes + "   -->    "+Lat+"                  /                   ";
 
                        Degres = ligne.Substring(15, 3);
                        Minutes = ligne.Substring(18, 2);
                        Secondes = ligne.Substring(20, 3);
 
                        Lng = double.Parse(Degres) + (double.Parse(Minutes) / 60.000) + (double.Parse(Secondes) * 60 / 1000 / 3600.000);
                        Lng = Math.Round(Lng, 6);
                        if (ligne.Substring(23, 1) == "W") Lng = -Lng;
 
                        //scriptString += Degres+" "+Minutes+" "+Secondes + "  -> "+Lng+"<br>";
 
                        Point.X = float.Parse(Lat.ToString());
                        Point.Y = float.Parse(Lng.ToString());
                        Liste.Add(Point);
                    }
                    ligne = monStreamReader.ReadLine();
 
 
                }
                catch
                {
                }
 
            }
 
            scriptString = Liste.Count.ToString();
 
            //scriptString = GoogleAPI.EncodeCoordinates(Liste);
 
 
            // Fermeture du StreamReader (attention très important) 
            monStreamReader.Close();
        }
        catch (Exception ex)
        {
            // Code exécuté en cas d'exception 
 
            scriptString = ex.Message;
        }
 
        Response.Write(scriptString);
    }
__________________
Vive Visual Studio.net !!!
FoxDeltaSierra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 21h36   #13
ElTotor
Membre confirmé
 
Homme François DORIN
Chef de Projet
Inscription : décembre 2012
Messages : 104
Détails du profil
Informations personnelles :
Nom : Homme François DORIN
Localisation : France, Vienne (Poitou Charente)

Informations professionnelles :
Activité : Chef de Projet
Secteur : Associations - ONG

Informations forums :
Inscription : décembre 2012
Messages : 104
Points : 226
Points : 226
J'ai peut être une piste intéressante !

Dans le try / catch au sein de ta boucle while, complète le catch vide pour y afficher un message d'erreur contenant des informations sur une éventuelle exception qui se déroulerait.

Et comme exception pouvant survenir, je verrais bien un problème avec le parsing des doubles (problème lié à la culture). Comme aucun culture n'est précisée, c'est la culture par défaut du système qui est utilisée

[edit]
Cela se tient d'autant plus que si jamais une exception se produit, tu ne va jamais à la fin de ton bloc try, et donc tu ne lis jamais la ligne suivante. Et donc tu traites inlassablement la même ligne. Je suis prêt à mettre ma main à couper que tu as une exception
[/edit]
ElTotor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 10h07   #14
FoxDeltaSierra
Membre du Club
 
Inscription : novembre 2004
Messages : 244
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 244
Points : 60
Points : 60
Envoyer un message via MSN à FoxDeltaSierra
Superbe, c'est bien ça en sortant le ligne = monStreamReader.ReadLine(); du try { } ca évite ainsi la boucle infinie !

Merci encore !
__________________
Vive Visual Studio.net !!!
FoxDeltaSierra est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h14.


 
 
 
 
Partenaires

Hébergement Web