Set di dati di grandi dimensioni di Entity Framework, eccezione di memoria esaurita

Sto lavorando a un set di dati molto ampio, circa 2 milioni di record. Ho il codice qui sotto ma ottengo un’eccezione di memoria esaurita dopo aver elaborato circa tre lotti, circa 600.000 record. Capisco che mentre scorre attraverso ogni carico pigro del framework di quadro batch, che sta quindi cercando di build i 2 milioni di record in memoria. C’è un modo per scaricare il lotto che ho elaborato?

ModelContext dbContext = new ModelContext(); IEnumerable<IEnumerable> towns = dbContext.Towns.OrderBy(t => t.TownID).Batch(200000); foreach (var batch in towns) { SearchClient.Instance.IndexMany(batch, SearchClient.Instance.Settings.DefaultIndex, "Town", new SimpleBulkParameters() { Refresh = false }); } 

Nota: il metodo Batch proviene da questo progetto: https://code.google.com/p/morelinq/

Il client di ricerca è questo: https://github.com/Mpdreamz/NEST

Il problema è che quando ottieni dati da EF ci sono in realtà due copie dei dati creati, una che viene restituita all’utente e una seconda su cui EF tiene e utilizza per il rilevamento delle modifiche (in modo che possa persistere le modifiche al database) . EF detiene questo secondo set per tutta la durata del contesto e questo set ti sta facendo uscire di memoria.

Hai 2 opzioni per affrontare questo

  1. rinnova il tuo contesto per ogni lotto
  2. Usa .AsNoTracking () nella tua query es:

     IEnumerable> towns = dbContext.Towns.AsNoTracking().OrderBy(t => t.TownID).Batch(200000); 

questo dice a EF di non conservare una copia per il rilevamento dei cambiamenti. Puoi leggere un po ‘di più su ciò che fa AsNoTracking e l’impatto sulle prestazioni di questo sul mio blog: http://blog.staticvoid.co.nz/2012/4/2/entity_framework_and_asnotracking