IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème lecture fichier TXT de 2500 lignes, et timeout server


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    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 actif
    Homme Profil pro
    Chef de Projet
    Inscrit en
    Décembre 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 113
    Points : 260
    Points
    260
    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 régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 actif
    Homme Profil pro
    Chef de Projet
    Inscrit en
    Décembre 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 113
    Points : 260
    Points
    260
    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 régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    C'est la constitution de la liste (2500 passages dans le While).
    Vive Visual Studio.net !!!

  6. #6
    Membre actif
    Homme Profil pro
    Chef de Projet
    Inscrit en
    Décembre 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 113
    Points : 260
    Points
    260
    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 régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Vive Visual Studio.net !!!

  8. #8
    Membre actif
    Homme Profil pro
    Chef de Projet
    Inscrit en
    Décembre 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 113
    Points : 260
    Points
    260
    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 actif
    Homme Profil pro
    Chef de Projet
    Inscrit en
    Décembre 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 113
    Points : 260
    Points
    260
    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 régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    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 actif
    Homme Profil pro
    Chef de Projet
    Inscrit en
    Décembre 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 113
    Points : 260
    Points
    260
    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 régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 actif
    Homme Profil pro
    Chef de Projet
    Inscrit en
    Décembre 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 113
    Points : 260
    Points
    260
    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 régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    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.

Discussions similaires

  1. [XL-2007] Saut de ligne lors de lecture fichier .txt
    Par Loupire dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/01/2010, 09h02
  2. Problème lecture fichier txt
    Par Sarah38000 dans le forum C++
    Réponses: 2
    Dernier message: 27/09/2008, 09h36
  3. [SAX] Problème lecture fichier xml
    Par BernardT dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 07/07/2005, 18h11
  4. Problème lecture fichier en C++
    Par cali1983 dans le forum C++
    Réponses: 17
    Dernier message: 20/05/2005, 09h36
  5. [langage] prob lecture fichier .txt
    Par martijan dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2003, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo