Bonjour,
j'ai un problème tout simple : je veux charger en base un nombre relativement important ( ~50 000) de données dans une seule table ( TAB ).
J'utilise Entity Framework.
Le problème est que la mémoire augmente sans cesse jusqu'à exploser.
J'ai essayé de découper mon chargement en plusieurs appels à la BDD, et ça ne marche pas.
En fait la mémoire augmente après chaque "SaveChanges()" et ne redescend plus.
J'ai l'impression (mais c'est une impression) que, comme je conserve un pointeur sur les objets que je viens de charger en base, Entity Framework les "mémorise" et du coup utilise de la mémoire.
Mais après, je ne vais pas toucher à ces objets, j'aimerais que Entity Framework les "oublie" une fois entrés en base.
Quelle est la bonne pratique ?
Et je précise, forcer le garbage collector n'arrange en rien.
Voilà un exemple de code, où j'ai essayé de découper "par paquets de 1000" :
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 public static void sauvegarde_TAB(List<Entitees.TAB> lgec) { // en entrée de la fonction List<TAB> lgec // contenant une liste des objets à charger for (int i = 0; i < lgec.Count; ) { using (Entitees.Entities db = new Entitees.Entities()) { for (int j = 0; j < 1000 && i < lgec.Count; j++) { db.TAB.AddObject(lgec[i]); i++; } db.SaveChanges(); } } }
Partager