tutorial mvc framework first example español curso c# entity-framework

c# - mvc - Entidad conjunto de datos de gran tamaño, fuera de la memoria de excepción



entity framework database first (1)

El problema es que cuando obtiene datos de EF, en realidad hay dos copias de los datos creados, una que se devuelve al usuario y otra que EF retiene y utiliza para la detección de cambios (para que pueda persistir los cambios en la base de datos) . EF mantiene este segundo conjunto durante el tiempo de vida del contexto y es este conjunto que te está quedando sin memoria.

Tienes 2 opciones para lidiar con esto.

  1. renueva tu contexto cada lote
  2. Utilice .AsNoTracking () en su consulta, por ejemplo:

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

esto le indica a EF que no guarde una copia para la detección de cambios. Puede leer un poco más acerca de lo que hace AsNoTracking y el impacto en el rendimiento de esto en mi blog: http://blog.staticvoid.co.nz/2012/4/2/entity_framework_and_asnotracking

Estoy trabajando en un conjunto de datos muy grande, aproximadamente 2 millones de registros. Tengo el código a continuación pero obtengo una excepción de falta de memoria después de que haya procesado alrededor de tres lotes, aproximadamente 600,000 registros. Entiendo que a medida que recorre las cargas perezosas del marco de cada entidad de proceso por lotes, que trata de acumular los 2 millones de registros completos en la memoria. ¿Hay alguna manera de descargar el lote uno que lo he procesado?

ModelContext dbContext = new ModelContext(); IEnumerable<IEnumerable<Town>> 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: el método por lotes proviene de este proyecto: https://code.google.com/p/morelinq/

El cliente de búsqueda es este: https://github.com/Mpdreamz/NEST