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 :

Deserialization trop lente


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Points : 51
    Points
    51
    Par défaut Deserialization trop lente
    Bonjour à tous,

    Dans un programme, j'ai besoin de Serializer / Deserializer un objet qui contient une liste pouvant contenir des centaines de milliers de petits objets avec seulement 2 propriétés de type int.

    La Serialization s'effectue assez rapidement (1 à 2 secondes). Le fichier créé a une taille d'environ 10 Mo.
    En revanche, la Deserialization est, elle, beaucoup plus lente (7 à 8 secondes), à tel point qu'elle perd tout son intérêt, car mon programme de base charge mon objet plus rapidement.

    Voici mon code de Serialization :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Serialization de l'objet toto
    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream(path + file, FileMode.Create, FileAccess.Write, FileShare.None);
    formatter.Serialize(stream, toto);
    stream.Close();
    Et mon code de Deserialization :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Deserialization
    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream(path + file, FileMode.Open, FileAccess.Read, FileShare.Read);
    MyObject toto = (MyObject)formatter.Deserialize(stream);
    stream.Close();
    Est-ce normal ? Y a t-il un moyen de réduire ce temps de Deserialization ?

    Merci d'avance.

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjours

    Une question me viens, tu dis
    à tel point qu'elle perd tout son intérêt, car mon programme de base charge mon objet plus rapidement.
    Que souhaites-tu faire? un clone?

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Points : 51
    Points
    51
    Par défaut
    Mon programme remplit l'objet "toto" en parcourant un fichier. Cela prend 5 secondes, voire plus, suivant la taille du fichier.
    En utilisant la Serialization, j'espérais sauvegarder mon objet "toto" à la fin de l'exécution du programme, pour que lors d'une prochaine exécution, on n'ait pas besoin de parcourir à nouveau le fichier, mais simplement de Deserializer notre objet, dans le but de gagner du temps.
    Mon problème est donc que la Deserialization ne me fait pas gagner de temps, au contraire...

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Points : 51
    Points
    51
    Par défaut
    Je tiens à préciser qu'après avoir fait des recherches sur le net, j'ai essayé :
    - UnsafeDeserialization au lieu de Deserialization
    - Implémenter ISerializable
    Aucune de ces deux techniques n'a rendu la Deserialization plus rapide.

  5. #5
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Citation Envoyé par Morgan7469 Voir le message
    En utilisant la Serialization, j'espérais sauvegarder mon objet "toto" à la fin de l'exécution du programme, pour que lors d'une prochaine exécution, on n'ait pas besoin de parcourir à nouveau le fichier, mais simplement de Deserializer notre objet, dans le but de gagner du temps.
    J'ai un doute là :
    Tu sérialises à la fin de ton programme pour sauvegarder, ok.
    A l'exécution suivante tu désérialises ? Autrement dis tu LIS ton fichier xml (j'imagine).
    J'ai l'impression que tu n'as pas bien compris ce qu'était la (dé-)sérialisation.
    Le plus simple pour toi : au démarrage tu charges tes élements depuis ton fichier. Ensuite tu manipules les objets en mémoire. Au moment choisi tu sauvegardes. Tu as une lenteur auchargement et après ça roule !

    Ensuite, si tu fais un fichier xml, c'est peut-être pratique, mais pas le plus performant du monde. Peut-être faut-il envisager une autre source de données (ne serait-ce qu'un simple fichier, voir à champs taille fixe)

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Points : 51
    Points
    51
    Par défaut
    Je pense qu'on m'a mal compris.

    Je sérialise à la fin de mon programme pour sauvegarder l'objet. Ce n'est pas une sérialisation XML mais une sérialisation binaire.
    Lors d'une deuxième exécution, je dé-sérialise pour récupérer l'objet que j'ai sauvegardé (ce qui m'évite de refaire tous les traitements que j'ai effectué la première fois).

  7. #7
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Donc tu as une lenteur à la lecture de ton fichier Binaire, c'est ça ?

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Points : 51
    Points
    51
    Par défaut
    Exactement.
    Le traitement que j'effectue (qui est très lourd) pour remplir mon objet dure 5 secondes + 2 secondes de sérialisation après.
    La dé-sérialisation, elle, dure 8 secondes... Alors que je l'ai mise en place pour gagner du temps, pas l'inverse...

  9. #9
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    10 Mio ça commence à faire du volume (surtout en binaire), tu dois avoir une tripoté d'objets !

    As-tu fais le test avec un petit volume de données avant ?

    Je ne connais pas IFormatter, mais je en trouve rien de choquant dans ton code. N'est-ce pas du aux performances réelles de ces fonctions ?

  10. #10
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Pourquoi ne pas découper le stockage en plus petits bouts et procéder à un chargement à la demande des bouts requis?

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 72
    Points : 51
    Points
    51
    Par défaut
    Plutôt que d'utiliser la sérialisation, j'ai écrit dans le fichier les attributs de mon objet à l'aide de BinaryWriter. Pour la lecture, j'ai utilisé BinaryReader.
    La lecture et l'écriture s'effectuent 3 à 4 fois plus rapide qu'avec la sérialisation/dé-sérialisation, et le fichier créé est considérablement moins gros.

    Mon problème est donc résolu (bien que je n'aurais pas eu l'explication de la raison pour laquelle la sérialisation/dé-sérialisation prend autant de temps).

    Merci à tous pour votre aide.

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

Discussions similaires

  1. Convolution trop lente...
    Par progfou dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 05/08/2006, 11h44
  2. [Eclipse] Editeur de code trop lent
    Par Benzeghiba dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 10/11/2005, 14h02
  3. boucle while trop lente
    Par atouze dans le forum Access
    Réponses: 17
    Dernier message: 15/06/2005, 16h35
  4. [SAGE] ODBC trop lent
    Par tileffeleauzed dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 14/11/2004, 09h56
  5. Envoi de mail trop lent
    Par MASSAKA dans le forum ASP
    Réponses: 3
    Dernier message: 15/10/2004, 10h57

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