OutOfMemoryException en la statement de Large Array

Tengo que crear una matriz doble bastante grande 12000ish x 55000ish. Lamentablemente, recibo una excepción de falta de memoria. Solía ​​desarrollarme en Java y podía cambiar la configuración de la memoria. ¿Es esto posible con C # o es simplemente imposible? Estoy usando VS 2008.

Cada double es de 8 bytes, por lo que está tratando de asignar una única matriz con poco más de 5 GB. El CLR tiene un límite por objeto de alrededor de 2GB IIRC, incluso para un CLR de 64 bits. En otras palabras, el problema no es la cantidad total de memoria disponible (aunque obviamente tendrá problemas si no tiene suficiente memoria), sino el tamaño por objeto.

Sugiero que lo dividas en matrices más pequeñas, tal vez detrás de una fachada de alguna descripción. No creo que haya ninguna forma de solucionar ese límite para una sola matriz.

EDITAR: podría elegir una matriz de matrices, también conocida como una matriz irregular :

 double[][] array = new double[12000][]; for (int i = 0; i < array.Length; i++) { array[i] = new double[55000]; } 

¿Eso sería aceptable para ti?

(No puede usar una matriz rectangular ( double[,] ) ya que tendría el mismo problema de tamaño por objeto).

Como no puede crear objetos de más de 2 GB, puede intentar usar MemoryMappedFile para trabajar con un trozo de memoria del tamaño requerido.

var data = MemoryMappedFile.CreateNew("big data", 12000L * 55000L); var view = data.CreateViewAccessor(); var rnd = new Random(); for (var i = 0L; i < 12000L; ++i) { for (var j = 0L; j < 55000L; ++j) { var input = rnd.NextDouble(); view.Write(i * 55000L + j, ref input); } }
var data = MemoryMappedFile.CreateNew("big data", 12000L * 55000L); var view = data.CreateViewAccessor(); var rnd = new Random(); for (var i = 0L; i < 12000L; ++i) { for (var j = 0L; j < 55000L; ++j) { var input = rnd.NextDouble(); view.Write(i * 55000L + j, ref input); } } 

Siempre que su memoria total sea suficiente, puede evitar las excepciones de falta de memoria que resultan de la fragmentación de LOH al crear un grupo de matrices más pequeñas y envolverlas en un IList único, o en alguna otra interfaz indexada.

Aquí hay un enlace que lo describe:

BigArray, getting around the 2GB array size limit

Créditos: esta publicación (matriz fragmentada C #) .

Bueno, o se ha quedado sin memoria (cierre algunos progtwigs) o está alcanzando el límite de asignación de memoria (aproximadamente 2 Gb), esta memoria debe ser un bloque contiguo. Podría usar una máquina de 64 bits, en cuyo caso tendrá más memoria disponible o creo que puede hacer que la dirección grande de la aplicación sea conciente (googlear le dirá cómo hacerlo si es posible en este caso).

Cree que agrega un modificador de / 3GB al archivo Boot.ini para el reconocimiento de direcciones grandes.