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

Windows Forms Discussion :

Envoi de Memory Stream par Socket


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 99
    Par défaut Envoi de Memory Stream par Socket
    Bonjour à tous,

    Je développe actuellement une application serveur qui contient comme base de données un DataSet (récupéré au démarrage sur une vraie BDD).

    Ce serveur traite les demandes des clients et envoi donc les tables de mon DataSet aux clients qui en ont besoin.

    J'envoi mes tables par l'intermediaire d'un dataset temporaire que je remplis au fur et à mesure avec les tables requises uniquement, ce DataSet je le sérialise et l'envoi ensuite via un socket.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Function SerializeStream() As Byte()
            Dim fmtServices As BinaryFormatter = New BinaryFormatter 'Binary
            Dim tempStream As MemoryStream = New MemoryStream
            Dim temp As Byte()
            Dim dsTemp As DataSet = New DataSet
     
    [...] ' Traitement pour ajouter les tables au DataSet temporaire "dsTemp"
     
            fmtServices.Serialize(tempStream, dsTemp) ' Sérialisation
            temp = tempStream.ToArray() ' Transformation de ma sérialisation en tableau de byte pour l'envoyer via socket
            tempStream.Close()
     
            Return temp 'Renvoi de mon tableau à envoyer directement
        End Function
    Mon gros problème se situe au niveau de la sérialisation, mon DataSet avec la méthode DataSet.WriteXML(...) ne pèse que 5Mo sur le disque dur. Mais lorsque j'envoie la totalité de mon DataSet la fonction Serialize() me prend presque 50 à 60 Mo en mémoire vive et ne la libère pas une fois la fonction retournée. Ce qui fait qu'au bout de 2 ou 3 clients connectés ça grimpe très très vite en mémoire. Au démarrage mon serveur fait 60 Mo en mémoire après la connexion de 2 ou 3 clients, je me retrouve avec 250 Mo (ensuite la mémoire descend / remonte ... mais ne dépasse plus cette valeur), ce qui me gène c'est que la base de données est quasi vide, c'était une base de test cela va donc me prendre beaucoup plus de place.

    Je me demandais donc s'il y avait une autre option que le MemoryStream pour envoyer mon DataSet ? Ou y a t il une autre option que je puisse utiliser autre que forcer mon Garbage Collector (on m'a conseille de pas trop y toucher)

    Merci beaucoup

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    la sérialisation est un bien et un mal
    c'est pratique mais le xml ca pèse quand même car quand une des valeurs contient une lettre (qui représente un octet donc) la sérialisation rajoute des entete xml sous forme de fichier texte et ton pauvre octet va se retrouver au milieu d'une bonne centaine d'octet (peut etre plus)
    super cool quoi de multiplier ainsi la mémoire requise ...

    sinon dans l'absolu une appli qui prend 250 ram c'est pas affreux non plus (et que l'espace pris en ram bouge est encore moins un soucis)

    donc tu pourrais envoyer les valeurs des cases de dataset par socket avec un séparateur maison (d'un caractère) et décoder le tout à l'arrivée, donc gain sur les perfs mais beaucoup plus de code à mettre

    sinon .net permet de faire du remoting, en gros il s'occupe tout seul de faire passer un dataset (ou autre objet) par réseau sans que tu codes le départ et l'arrivée, en fait il sérialiser l'objet et le désérialise de l'autre coté
    donc pas sur que ca prenne moins de place (par contre une fois la synchronisation faite entre l'instance serveur et l'instance client, ne transite que les données modifiées donc peu de charge réseau)

    sinon y a des trucs plus lite que le dataset comme un tableau multi colonne contenant les valeurs (mais sans les avantages du dataset, après ca depend de ce que tu fais exactement avec tes données)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Pourquoi passer par un MemoryStream ? tu pourrais écrire le dataset directement sur la socket :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim sock As Socket
     
    ...
     
     
    Dim nStream As New NetworkStream(sock)
    fmtServices.Serialize(nStream, dsTemp)
    Comme ça tu évite de conserver en mémoire le DataSet sérialisé...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 99
    Par défaut
    J'ai commencé un bout de code avec le NetworkStream ça a l'air de fonctionner et d'être une bonne idée, je ne connaissais pas cette méthode pour envoyer via un socket, merci.

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

Discussions similaires

  1. Envoi d'une valeur par socket
    Par bibom dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/06/2007, 14h04
  2. débutant : envoi d'un String par socket impossible
    Par 2tsiris dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 26/02/2007, 18h17
  3. Envoi d'un fichier par socket
    Par Aleksis dans le forum C++
    Réponses: 12
    Dernier message: 12/08/2006, 05h10
  4. Réponses: 3
    Dernier message: 06/03/2006, 10h36
  5. Ouverture de connexion et envoi d'un message par socket
    Par loleske dans le forum C++Builder
    Réponses: 3
    Dernier message: 10/02/2005, 12h52

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