'System.OutOfMemoryException' foi lançado quando ainda há bastante memória livre
Este é o meu código:
int size = 100000000;
double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb
double[] randomNumbers = new double[size];
Exceção: exceção do tipo 'System.OutOfMemoryException' foi lançada.
Eu tenho 4GB de memória nesta máquina 2.5GB é grátis quando eu começo esta corrida, há claramente espaço suficiente no PC para lidar com os 767mb de 100000000 números aleatórios. Eu preciso armazenar tantos números aleatórios quanto possível, dada a memória disponível. Quando vou para a produção, tenho 12 GB na caixa e quero usá-la.
O CLR me restringe a uma memória máxima padrão para começar? e como peço mais?
Atualizar
Eu pensei em dividir isso em partes menores e adicionar incrementalmente aos meus requisitos de memória ajudaria se o problema fossefragmentação de memória, mas isso nãoEu não consigo passar de um tamanho total de 256mb da ArrayList, independentemente do que eu faço para ajustar o 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()));
}
}
Do meu 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;