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

ASP.NET Discussion :

problème de mémoire saturée


Sujet :

ASP.NET

  1. #1
    Membre régulier Avatar de paradeofphp
    Inscrit en
    Décembre 2005
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 313
    Points : 94
    Points
    94
    Par défaut problème de mémoire saturée
    Bonjour tout le monde,
    j'ai le problème suivant :

    j'ai créé 1 interface pour faire des statistiques sur les types de cartes que j'ai dans ma base. les informations affichées viennent de 5 tables.

    Mon interface contient un combo dans lequel j'ai mis tout les types de carte (10 types). lorsque l'utilisateur choisit un type donné, les informations s'affiche dans un datagrid.

    La solution que j'ai utilisée consiste à charger dans un dataset les 5 tables et le stocker dans une varibale de session:
    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
     
    Private Sub Create_Dataset()
     
         Cartes_DS = New DataSet("Cartes")
         Dim query As String
         Dim Level_DV As DataView
     
         InitConnexion()
     
         'Création de la table Cartes
         query = "SELECT * from cartes order by ID_CARTE"
          Provider.FillDataSet(CommandType.Text, query, Cartes_DS, "Cartes")
     
          'Création de la table Personnes
          query = "SELECT * from personnes"
          Provider.FillDataSet(CommandType.Text, query, Cartes_DS, "Personnes")
     
          'Création de la table Porteurs           
          query = "SELECT * from PORTEUR"
          Provider.FillDataSet(CommandType.Text, query, Cartes_DS, "Porteurs")
     
          'Création de la table Supporte          
          query = "SELECT * from Supporte"
          Provider.FillDataSet(CommandType.Text, query, Cartes_DS, "Supporte")
     
         'Création de la table Type_Porteur
         query = "SELECT * from TYPE_PORTEUR"
         Provider.FillDataSet(CommandType.Text, query, Cartes_DS, "TypePorteur")
     
        'stocker le dataset ds une variable de session pour pouvoir le récupérer après
         Me.setVariableSession("Cartes_DS", Cartes_DS)
    Après j'applique des filtre selon le type de carte pour afficher les informations. le problème que j'ai est que la quantité de données chargée en mémoire est énorme (plus de 9000 lignes uniquement dans la table cartes) et je fini à avoir une utilisation à 100% du CPU et 400Mo de mémoire ce qui m'affiche le message d'erreur suivant : Out of memory

    la première chose à laquelle j'ai pensé pour optimiser mon code est la précision des colonnes à afficher dans mes requêtes au lieu du * :

    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
      Private Sub Create_Dataset()
     
                Cartes_DS = New DataSet("Cartes")
                Dim query As String
                Dim Level_DV As DataView
     
                InitConnexion()
     
                'Création de la table Cartes
                query = "SELECT ID_CARTE,ID_CONSORTIUM,ID_EMETTEUR,ID_SITE,ID_CENTRE,DUREE_VIE,DATE_CONSORTIUM,DATE_ATTRIBUTION,DATE_REBUT,MOTIF_REBUT,DATE_DELIVRANCE,DATE_OPPOSITION,MOTIF_OPPOSITION,DATE_LEVEE_OPPOSITION,MOTIF_LEVEE_OPPOSITION,DATE_DESTRUCTION,MOTIF_DESTRUCTION,DATE_EMET,DATE_SITE,DATE_CENTRE,STATUT from cartes order by ID_CARTE"
                Provider.FillDataSet(CommandType.Text, query, Cartes_DS, "Cartes")
     
                'Création de la table Personnes
                query = "SELECT ID_PERSONNE,NOM,PRENOM from personnes"
                Provider.FillDataSet(CommandType.Text, query, Cartes_DS, "Personnes")
     
     
                'Création de la table Porteurs           
                query = "SELECT ID_PORTEUR,ID_PERSONNE,ID_CARTE,ID_TYPE_PORTEUR from PORTEUR"
                Provider.FillDataSet(CommandType.Text, query, Cartes_DS, "Porteurs")
     
                'Création de la table Supporte          
                query = "SELECT * from Supporte"
                Provider.FillDataSet(CommandType.Text, query, Cartes_DS, "Supporte")
     
                'Création de la table Type_Porteur
                query = "SELECT ID_TYPE_PORTEUR,LIBELLE from TYPE_PORTEUR"
                Provider.FillDataSet(CommandType.Text, query, Cartes_DS, "TypePorteur")
     
                'stocker le dataset ds une variable de session pour pouvoir le récupérer après
                Me.setVariableSession("Cartes_DS", Cartes_DS)
     
            End Sub
    Sinon qu'est ce que vous me conseillez pour optimiser davantage mon code ?
    y'a t-il pa d'autres méthodes bien meilleures que le chargement des données en mémoire ?
    N'hésitez pas à me donner vos suggestions ou poser des questions. merci a vous tous et bon courage.

  2. #2
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Je pense pas que les variables de sessions soient faites pour stocker autant.
    Si y a 3 ou 4 users en meme temps, ton serveur explose

  3. #3
    Membre régulier Avatar de paradeofphp
    Inscrit en
    Décembre 2005
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 313
    Points : 94
    Points
    94
    Par défaut
    merci pour ta réponse,
    alors qu'est ce que tu me proposes comme solution ?

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Pourquoi tout vouloir stocker dans un DataSet ?
    Pourquoi ne pas récupérer les données nécessaire au moment où elles sont demandées, et garder en cache simplement les données les plus utilisées ?

  5. #5
    Membre régulier Avatar de paradeofphp
    Inscrit en
    Décembre 2005
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 313
    Points : 94
    Points
    94
    Par défaut
    en fait la table la plus utilisée et celle la plus volumineuse.
    Sinon y'a pas un autre moyen outre que les dataset et qui va me garantir des bonnes performances ?

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Tu as besoin de toute la table ? Quel est le temps d'exécution pour récupérer les données dont tu as besoin à l'instant T. Il serait bon d'évaluer le rapport (temps d'exécution)/(volume mémoire occupé).

  7. #7
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Je suppose que ton datagrid est paginé, non?
    Si oui, voilà ce que je te propose: va falloir mettre en place un système de pagination plus évolué que celui par défaut afin de n'aller chercher en base que les enregistrements affichés (par défaut, ça récupère tous les enregistrements).
    Ainsi, tu pourras interroger ta base à chaque fois mais ça ne posera pas de pb dans la mesure où tu ne raméneras que 50 enregistrements (si tu affiches 50 enregistrements par page)

  8. #8
    Membre régulier Avatar de paradeofphp
    Inscrit en
    Décembre 2005
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 313
    Points : 94
    Points
    94
    Par défaut
    comme j'ai dit dans mon premier poste, j'ai précisé dans ma requête que les champs dont j'ai besoin. là j'ai une légère amélioration par rapport au début.

  9. #9
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Citation Envoyé par paradeofphp Voir le message
    comme j'ai dit dans mon premier poste, j'ai précisé dans ma requête que les champs dont j'ai besoin. là j'ai une légère amélioration par rapport au début.
    T'as pas bien compris ce que j'ai dit.
    On va partir du principe que ton DataGrid est paginé.
    T'as 9000 lignes à afficher et tu configures ton DataGrid pour afficher 50 lignes par page. Bien qu'à l'écran tu ne vois que 50 enregistrements, le DataGrid interroge la base et récupère tous les enregistrements, soit 9000 enregistrements récupérés pour en afficher au final que 50.
    Et à chaque fois que tu vas changer de page, ca va refaire pareil.

    C'est le fonctionnement par défaut du DataGrid mais il est possible de le modifier. D'où l'amélioration que je te propose dans mon post précédent.

  10. #10
    Membre régulier Avatar de paradeofphp
    Inscrit en
    Décembre 2005
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 313
    Points : 94
    Points
    94
    Par défaut
    les 9000 représentent toutes les lignes que j'ai dans ma table Cartes.
    Donc c'est 9000 lignes sont chargées dans mon Dataset.
    Après, selon le type de carte choisi, j'applique des filtres pour n'afficher que les lignes le concernant.

Discussions similaires

  1. [WORD]Problème de mémoire
    Par Dnx dans le forum VBA Word
    Réponses: 17
    Dernier message: 05/10/2005, 15h48
  2. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 15h57
  3. [Crystal Report]Problème de mémoire avec le moteur RDC
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/05/2005, 10h09
  4. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 11h11
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 21h06

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