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 :

Optimisation chargement XML de 10 MO


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Juin 2015
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Juin 2015
    Messages : 87
    Points : 61
    Points
    61
    Par défaut Optimisation chargement XML de 10 MO
    Bonjour tout le monde

    J'ai un xml de 40 000 lignes faisant un peu moins de 10 Mo dont voici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Radiateurs>
    	<Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Standard" Hauteur="400" Longueur="450" Type="10S" P50="185" Pente="1.297" Volume="0.99" Poids="3.51" Prix="48.6" Reference="10S40 0450" SS="false" SSEC="true" SSM="false" SSE="false"/>
    </Radiateurs>
    j'ai une classe XmlSerializingExtensions

    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
     
     public static class XmlSerializingExtensions
        {
            public static XElement ToXElement<T>(this object obj)
            {
                using (var memoryStream = new MemoryStream())
                {
                    using (TextWriter streamWriter = new StreamWriter(memoryStream))
                    {
                        var xmlSerializer = new XmlSerializer(typeof(T));
                        xmlSerializer.Serialize(streamWriter, obj);
                        return XElement.Parse(Encoding.UTF8.GetString(memoryStream.ToArray()));
                    }
                }
            }
     
            public static T FromXElement<T>(this XElement xElement)
            {
                var xmlSerializer = new XmlSerializer(typeof(T));
                return (T)xmlSerializer.Deserialize(xElement.CreateReader());
            }
        }
    une Interface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface IDataRadiateur<T>
        {
            IEnumerable<T> GetAll();
     
        }
    une classe XmlProvider

    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
     
    class RadiateurXmlProvider : IDataRadiateur<Radiateur>
        {
            private readonly XDocument doc;
            private readonly string xmlFilePath;
     
            public RadiateurXmlProvider(string xmlFilePath)
            {
                this.xmlFilePath = xmlFilePath;
                doc = XDocument.Load(xmlFilePath);
            }
            public IEnumerable<Radiateur> GetAll()
            {
                return doc.Descendants("Radiateur").Select(element => element.FromXElement<Radiateur>());
            }
    et mon ViewModel :
    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
     
      public SelectionRadiateurViewModel()
            {
     
     
                RadiateurProvider = new RadiateurXmlProvider("Radiateurs.xml");
                           base.DisplayName = Strings.SelectionRadiateurViewModel_DisplayName;
     
     
     
            }
            public SelectionRadiateurViewModel(IDataRadiateur<Radiateur>providerradiateur)
            {
     
     
                RadiateurProvider = providerradiateur;
     
     
     
            }
    mon problème est quand je charge mon UserControl, il met entre 13 et 20 secondes pour se charger, comment pourrais je optimisé cela. J'ai lu que la Class XmlReader est plus efficiente pour les gros fichier XML mais je ne sais pas trop comment la mettre en oeuvre.

    Pourriez vous m'aider un petit peu.

    En vous remerciant d'avance

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    En reprenant ton code, j'ai pu créer une liste de plus de 300000 radiateurs en 12 secondes (fichier de 78Mo). Pour tes 40000, il m'a fallu moins de 2 secondes sans affichage.
    As-tu pu déterminer précisément la partie de code qui génère la lenteur de l'affichage de ton UserControl ?

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Juin 2015
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Juin 2015
    Messages : 87
    Points : 61
    Points
    61
    Par défaut
    déjà ebastien merci de intéresser à mon code


    ce que j'ai pu en voir c'est vraiment au load de mon usercontrol que mon RadiateurProvider rame à mort... après je fais quelque modification genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    var listmarqueradiateur = RadiateurProvider.GetMarque(_IsCheckedSecheServiette.ToString().ToLower());
                ListMarqueRadiateur = new ObservableCollection<string>(listmarqueradiateur);
                        var listecompleteradiateur = RadiateurProvider.GetAll();
               ListeCompleteRadiateur = new ObservableCollection<Radiateur>(listecompleteradiateur);
    mais a priori cela n'influe pas sur le load de mon usercontrol.

    As-tu pu déterminer précisément la partie de code qui génère la lenteur de l'affichage de ton UserControl ?
    a part RadiateurProvider = new RadiateurXmlProvider("Radiateurs.xml"); qui prend +- 10 second tout se passe bien c'est assez rapide après...

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Perso, en général, quand je travaille avec du XML que je n'ai pas "généré", je passe par XSD pour me générer automatique la classe associée à mon XML et ensuite,
    un coup de déserialisation et basta c'est fini...

    et c'est super rapide.

    J'ai un fichier de 600000 enregistrement qui sur un PC core i7 8Mo de 4 ans se charge en 3 secondes

    Peut-être l'usage d'interface qui ralentit le bousin...
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Oui c'est assez étonnant d'autant que le constructeur de RadiateurXmlProvider n'effectue qu'un load qui pour ma part prend 3 secondes pour un fichier de 78Mo. Après cela dépend aussi de la configuration machine (j'ai un Core i5 avec 16Go de mémoire).

  6. #6
    Membre du Club
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Juin 2015
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Juin 2015
    Messages : 87
    Points : 61
    Points
    61
    Par défaut
    bah j'ai un I5 6500U avec 8 Go de ram et c'est la première fois que ça rame autant ... et je passe par un xsd pour construire aussi mon xml ...

    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
     
     <xsd:attribute name="Marque" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="Modele" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="Gamme" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="Hauteur" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="Longueur" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="PElec" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="P50" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="Prix" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="Pente" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="Volume" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="Poids" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="Type" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="Reference" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="SS" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="SSEC" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="SSM" type="xsd:string" ></xsd:attribute>
      <xsd:attribute name="SSE" type="xsd:string" ></xsd:attribute>
      <xsd:element name="Radiateur" >
             <xsd:complexType>
     
              <xsd:attribute ref="Marque" ></xsd:attribute>
      <xsd:attribute ref="Modele" ></xsd:attribute>
      <xsd:attribute ref="Gamme" ></xsd:attribute>
        <xsd:attribute ref="Hauteur" ></xsd:attribute>
          <xsd:attribute ref="Longueur" ></xsd:attribute>
            <xsd:attribute ref="Type" ></xsd:attribute>  
               <xsd:attribute ref="PElec" ></xsd:attribute>
                  <xsd:attribute ref="P50" ></xsd:attribute>
                    <xsd:attribute ref="Pente" ></xsd:attribute>
                      <xsd:attribute ref="Volume" ></xsd:attribute>
                        <xsd:attribute ref="Poids" ></xsd:attribute>
                          <xsd:attribute ref="Prix" ></xsd:attribute>
                            <xsd:attribute ref="Reference" ></xsd:attribute>
                              <xsd:attribute ref="SS" ></xsd:attribute>
               <xsd:attribute ref="SSEC" ></xsd:attribute>
               <xsd:attribute ref="SSM" ></xsd:attribute>
               <xsd:attribute ref="SSE" ></xsd:attribute>
     
     
          </xsd:complexType>
      </xsd:element>
     
      <xsd:element name="Radiateurs">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element ref="Radiateur" maxOccurs="unbounded"></xsd:element>
          </xsd:sequence>
     
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    j'ai tout mis en string pour voir si cela changeait quelque chose et j'ai simplifié les noms, cela change pas grand chose

Discussions similaires

  1. Optimisation chargement fichier xml
    Par djspank dans le forum Linq
    Réponses: 9
    Dernier message: 11/12/2009, 11h36
  2. Chargement XML dans Flash
    Par wiloue dans le forum Flash
    Réponses: 1
    Dernier message: 30/03/2007, 18h25
  3. [2.0] Optimisation chargement UserControl
    Par jbourgeais dans le forum ASP.NET
    Réponses: 5
    Dernier message: 09/02/2007, 15h30
  4. Numero erreur chargement XML
    Par julio84 dans le forum ASP
    Réponses: 2
    Dernier message: 22/06/2006, 16h16
  5. Chargement xml dynamique
    Par zwck dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/04/2006, 15h56

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