2012-12-19 5 views
9

J'essaie de sauvegarder des centaines de milliers d'enregistrements en utilisant le framework Entity. Après avoir enregistré quelques centaines de milliers de dossiers que je reçois l'erreur suivante:System.OutOfMemoryException utilisant Entity Framework?

: System.OutOfMemoryException

Mon code

foreach (BibContent objbibcontents in lstBibContent) 
     { 
      db.BibContents.AddObject(objbibcontents); 
      c = c + 1; 
      if (c == 1000) 
      { 
       db.SaveChanges(); 
       c = 0; 
      } 
     } 

J'ai remarqué après avoir sauvé 1000 enregistrements ma db ne surchargez pas encore 1000 dossiers. c'est les ajouter dans mon dbcontext.

Je crée une nouvelle instance après 1000 enregistrements mais ma base de données contient toujours les données de l'objet précédent. Voir mon code

foreach (var objbibcontents in lstBibContent) 
      { 
       vibrantEntities db1 = new vibrantEntities(szConStr); 
       lstBibCon.Add(objbibcontents); 
       // db.BibContents.AddObject(objbibcontents); 
       c = c + 1; 
       if (c == 1000) 
       { 
        foreach (BibContent bibobject in lstBibCon) 
        { 
         db1.BibContents.AddObject(bibobject); 
        } 
        lstBibCon.Clear(); 
        db1.SaveChanges(); 
        c = 0; 
        flag = 1; 
       } 
      } 

Répondre

12

Combien d'objets allez-vous enregistrer et quelle est la taille d'un seul objet? DbContext contient des références à tous les objets que vous avez ajoutés avec l'appel AddObject. Appeler SaveChanges ne purge pas ses structures de données internes, donc si vous appelez votre code pour des objets 1M, vous aurez un objet 1M en mémoire et ils seront complètement vivants car leur objet racine pour GC sera l'instance de contexte qui est toujours dans votre portée code.

Si vous voulez éviter le problème de mémoire, vous devez utiliser une nouvelle instance de contexte pour chaque 1000 enregistrements (ou même chaque enregistrement). La seule différence entre exécuter SaveChanges pour 1000 enregistrements et pour enregistrement unique est la transaction automatiquement impliquée.

+0

puis-je effacer mon dbcontext plutôt que de créer à nouveau? –

+0

Vous devez aller définir chaque objet ajouté comme détaché. Créer une nouvelle instance de contexte est beaucoup mieux. –