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:
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
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)
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 * :
Sinon qu'est ce que vous me conseillez pour optimiser davantage mon code ?
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
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.
Partager