Dado que el entramado de entidades mantiene los datos en la memoria (al igual que muchos ORM), entonces, como ocurre con muchas colecciones en memoria, probablemente haya matrices internas. A medida que agrega elementos a una colección, la matriz interna se duplica en capacidad.
Por ejemplo, si tiene una colección como una ArrayList que contiene 256 elementos, y agrega el 257o elemento, entonces lo que sucede internamente es un nuevo bloque de memoria asignado para una matriz de 512 elementos, ellos 256 elemento matriz es copiado a la nueva matriz de 512 elementos, y luego la matriz de 256 elementos está disponible para la recolección de basura. Por lo tanto, en el punto de transición, tendrá 768 elementos asignados en la memoria solo porque haya agregado el 257. ° elemento. Me he encontrado con dolores de cabeza cuando uso Memorystream, porque necesitas casi 3 veces más memoria contigua no fragmentada de la que realmente necesitas. Esta es la propiedad .Capacity que se ve en las colecciones, y casi siempre es una potencia de 2 (ya que se duplica en tamaño según sea necesario).
Mi apuesta es que hay matrices internas que se duplican en tamaño según sea necesario para sus colecciones de objetos de memoria. Entonces, 300,000 objetos del mismo tipo probablemente se mantendrían en una matriz interna de tamaño 524,288. Además, si es similar a las técnicas similares en el .NEt Framework, cada vez que se agrega el 262145o elemento, tanto una matriz de 262144 como 524288 existía en la memoria mientras los elementos se copiaban en la nueva matriz. Un total de 786432 elementos en la memoria. La matriz anterior se mantendría hasta que el recolector de basura decidiera que ya no era necesaria.
Puede haber algunas opciones en el marco Entity con respecto al soporte de simultaneidad que podría deshabilitar, lo que podría mejorar el uso de la memoria. Sin embargo, aquí solo estoy especulando, pero para admitir la concurrencia almacenan en memoria tanto la versión actual de los datos, como su versión original para comparar y admitir la concurrencia.
También buscaría filtrar con qué datos está interactuando. Intente encontrar criterios inteligentes para limitar lo que se consulta y se carga en la memoria. Por ejemplo, si tenía una aplicación que permitía a un usuario editar cuentas de clientes, pero solo se le asignaban ciertas cuentas, entonces utilícela como su criterio de filtrado para que solo cargue en la memoria aquellas cuentas con las que el usuario podría interactuar.