'System.OutOfMemoryException' se lanzó cuando todavía hay mucha memoria libre

Este es mi código:

int size = 100000000;
double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb
double[] randomNumbers = new double[size];

Excepción: se ha emitido una excepción del tipo 'System.OutOfMemoryException'.

Tengo 4GB de memoria en esta máquina 2.5GB es gratis cuando empiezo esta ejecución, claramente hay suficiente espacio en la PC para manejar los 762 mb de 100000000 números aleatorios. Necesito almacenar tantos números aleatorios como sea posible dada la memoria disponible. Cuando vaya a producción, habrá 12 GB en la caja y quiero usarlo.

¿El CLR me obliga a comenzar con una memoria máxima predeterminada? y como solicito mas?

Actualizar

Pensé que dividir esto en partes más pequeñas y agregar incrementalmente a mis requisitos de memoria ayudaría si el problema se debe afragmentación de la memoria, pero no lo haceNo puedo pasar de un tamaño total de ArrayList de 256 mb, independientemente de lo que hago ajustando blockSize.

private static IRandomGenerator rnd = new MersenneTwister();
private static IDistribution dist = new DiscreteNormalDistribution(1048576);
private static List<double> ndRandomNumbers = new List<double>();

private static void AddNDRandomNumbers(int numberOfRandomNumbers) {
    for (int i = 0; i < numberOfRandomNumbers; i++) {
      ndRandomNumbers.Add(dist.ICDF(rnd.nextUniform()));                
  }
}

De mi método principal:

int blockSize = 1000000;

while (true) {
  try
  {
    AddNDRandomNumbers(blockSize);                    
  }
  catch (System.OutOfMemoryException ex)
  {
    break;
  }
}            
double arrayTotalSizeInMegabytes = (ndRandomNumbers.Count * 8.0) / 1024.0 / 1024.0;

Respuestas a la pregunta(13)

Su respuesta a la pregunta