Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 14 sur 14
  1. #1
    Membre du Club
    Inscrit en
    novembre 2004
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : novembre 2004
    Messages : 249
    Points : 67
    Points
    67

    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 :

    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 !!!

  2. #2
    Membre confirmé
    Homme Profil pro François DORIN
    Chef de Projet
    Inscrit en
    décembre 2012
    Messages
    107
    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 : 107
    Points : 227
    Points
    227

    Par défaut

    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)

  3. #3
    Membre du Club
    Inscrit en
    novembre 2004
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : novembre 2004
    Messages : 249
    Points : 67
    Points
    67

    Par défaut

    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 !!!

  4. #4
    Membre confirmé
    Homme Profil pro François DORIN
    Chef de Projet
    Inscrit en
    décembre 2012
    Messages
    107
    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 : 107
    Points : 227
    Points
    227

    Par défaut

    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 ?

  5. #5
    Membre du Club
    Inscrit en
    novembre 2004
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : novembre 2004
    Messages : 249
    Points : 67
    Points
    67

    Par défaut

    C'est la constitution de la liste (2500 passages dans le While).
    Vive Visual Studio.net !!!

  6. #6
    Membre confirmé
    Homme Profil pro François DORIN
    Chef de Projet
    Inscrit en
    décembre 2012
    Messages
    107
    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 : 107
    Points : 227
    Points
    227

    Par défaut

    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 ^^

  7. #7
    Membre du Club
    Inscrit en
    novembre 2004
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : novembre 2004
    Messages : 249
    Points : 67
    Points
    67
    Vive Visual Studio.net !!!

  8. #8
    Membre confirmé
    Homme Profil pro François DORIN
    Chef de Projet
    Inscrit en
    décembre 2012
    Messages
    107
    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 : 107
    Points : 227
    Points
    227

    Par défaut

    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.

  9. #9
    Membre confirmé
    Homme Profil pro François DORIN
    Chef de Projet
    Inscrit en
    décembre 2012
    Messages
    107
    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 : 107
    Points : 227
    Points
    227

    Par défaut

    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...

  10. #10
    Membre du Club
    Inscrit en
    novembre 2004
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : novembre 2004
    Messages : 249
    Points : 67
    Points
    67

    Par défaut

    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 !!!

  11. #11
    Membre confirmé
    Homme Profil pro François DORIN
    Chef de Projet
    Inscrit en
    décembre 2012
    Messages
    107
    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 : 107
    Points : 227
    Points
    227

    Par défaut

    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 ??

  12. #12
    Membre du Club
    Inscrit en
    novembre 2004
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : novembre 2004
    Messages : 249
    Points : 67
    Points
    67

    Par défaut

    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 !!!

  13. #13
    Membre confirmé
    Homme Profil pro François DORIN
    Chef de Projet
    Inscrit en
    décembre 2012
    Messages
    107
    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 : 107
    Points : 227
    Points
    227

    Par défaut

    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]

  14. #14
    Membre du Club
    Inscrit en
    novembre 2004
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : novembre 2004
    Messages : 249
    Points : 67
    Points
    67

    Par défaut

    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 !!!

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •