OutOfMemoryException (en máquinas de 32 bits) es tan a menudo sobre Fragmentación como límites duros reales en la memoria - encontrará mucho sobre esto, pero aquí está mi primer Google golpear a discutir brevemente que: http://blogs.msdn.com/b/joshwil/archive/2005/08/10/450202.aspx. (@Anthony Pegram se refiere al mismo problema en su comentario anterior).
Dicho esto, no hay otra posibilidad que viene a la mente de su código de arriba: Como usted está utilizando el constructor "IEnumerable" a la lista, puede no dar el objeto ninguna pista en cuanto al tamaño de la colección que está pasando al constructor Lista. Si el objeto que está transfiriendo no es una colección (no implementa la interfaz ICollection
), detrás de las escenas, la implementación de la lista necesitará crecer varias (o muchas) veces, dejando cada vez un tamaño demasiado pequeño. matriz que debe ser recogida de basura. Es probable que el recolector de basura no llegue a esos arrays descartados lo suficientemente rápido y obtendrás tu error.
La solución más simple para esto sería usar el constructor List(int capacity)
para decirle al framework qué tamaño de matriz de respaldo asignar (incluso si está calculando y simplemente adivinando "50000" por ejemplo), y luego usar el método AddRange(IEnumerable collection)
para en realidad puebla tu lista.
Por lo tanto, más simple "arreglo" si estoy en lo cierto: sustituir
List<Vehicle> vList = new List<Vehicle>(selectedVehicles);
con
List<Vehicle> vList = new List<Vehicle>(50000);
vList.AddRange(selectedVehicles);
Todos los demás comentarios y respuestas siguen siendo válidas en términos de decisiones generales de diseño - pero esto podría ser una solución rápida.
Nota (como @Alex comentado a continuación), esto es solo un problema si selectedVehicles
no es un ICollection.
¿Cuál es el valor (y tipo) de 'selectedVehicles'? – harold
Cuando se lanzó 'OutOfMemoryException', ¿se conectó al proceso con un depurador y ve cuál podría ser el problema? ¿Qué tan grandes * fueron * los objetos? .NET Framework tiene un límite estricto de 2 GB para el tamaño del objeto, menos la sobrecarga consumida por el propio marco. –
¿Es posible que Vehicle sea una estructura en lugar de una clase? –