|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : novembre 2007 Messages : 22 ![]() |
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 :
|
||
|
|
00
|
|
|
#2 | |
|
Membre éprouvé
![]() Ingénieur développement logiciels Inscription : mars 2011 Messages : 258 ![]() |
Bonjour
Déjà je vois pas de cause spécifique à ton erreur dans ton code. Ce type de code devrait passer avec un nombre d'insert bcp plus grand. Sauf si une instance de Entitees.TAB pèse vraiment bcp en mémoire. Citation:
Mais il me semble que ce tracage n'intervient qu'en cas de requête de lecture, pas sur les requêtes d'insert. Pour la bonne pratique, tu as raison de forcer le commit sur le SQL tous les n insert. Personnellement je fais ça avec un calcul de modulo, mais ta double bloucle fonctionne aussi. Tu pourrais nous données la description de Entitees.TAB? Y'a peut-être un loup de se coté là. |
|
|
|
00
|
|
|
#3 | ||||
|
Invité de passage
![]() Inscription : novembre 2007 Messages : 22 ![]() |
Pour la description de Entitiees.Tab :
En gros, c'est l'entité générée automatiquement d'après la table de base de donnée (Oracle) qui ressemble à : Code :
Le plus étonnant c'est que j'ai fait une "expérience". Explication : La fonction de "remplissage" est appelée par un bouton (rien d'extraordinaire). Je lui fait remplir les 10 000 premiers éléments sachant que je fais un "SaveChanges" tous les 1000. A chaque "SaveChanges", la mémoire grimpe de 30 ~ 40 Mo. Nota bene : après chaque "SaveChanges" je "réinitialise grâce à un : Code :
Là où ça devient surréaliste, c'est que une fois ce traitement terminé et que je reprend sur l'IHM, je relance la fonction sauvegarde_TAB (elle est suffisamment intelligente pour savoir où recommencer) pour charger les 10 000 suivants. La mémoire est toujours importante et puis à un moment, sans que j'explique pourquoi, lors d'un "SaveChanges", hop elle est nettoyée et rebaisse. Ce qui est encore plus étonnant c'est que si j'appelle la fonction sauvegarde_TAB avec une boucle for, et bien la mémoire ne baisse pas. Honnêtement, je ne comprends rien. Je pense qu'il s'agit d'un comportement imprévisible d'entity framework ou tu plugin Oracle. Bref du code codé en dur qu'on ne peut explorer. Ce qui me fait penser : y a t il une fonction C# pour "recharger" une DLL ? J'aimerais bien forcer le rechargement de la DLL d'entity framework et de celle d'Oracle pour voir. |
||||
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Ange GuyaderDéveloppeur .NET Inscription : août 2011 Messages : 7 ![]() |
Bonsoir comme il a été dit plus haut ton code devrait fonctionner, je chargeais 200000 lignes voir plus de cette façon...
Les fois ou j'ai pu avoir un OutOfMemory étaient liées à ma machine (les 4go était saturés) car j'effectuais les tests en local. De combien disposes tu de RAM? Tu es sure de ne pas avoir une boucle quelque part? D'un pure point de vue performance je t'invite aussi à regarder du coté du BulkCopy |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : novembre 2003 Messages : 17 ![]() |
Le fameux outofmemory a tendance a sortir vers les 800Mo chargés dans VS, quand a entity, il a un nombre d'objets limite chargés (cette limite est floue).
Les prochaine versions de Vs et d'entity doivent corriger ces problemes. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com