이것은 내 코드입니다.
int size = 100000000;
double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb
double[] randomNumbers = new double[size];
예외 : 'System.OutOfMemoryException'유형의 예외가 발생했습니다.
이 컴퓨터에 4GB의 메모리가 있습니다. 이 실행을 시작할 때 2.5GB는 무료 이며, 100000000 개의 난수 중 762MB를 처리 할 수있는 충분한 공간이 PC에 있습니다. 사용 가능한 메모리가 주어지면 가능한 한 많은 난수를 저장해야합니다. 프로덕션에 들어가면 상자에 12GB가있을 것이고 그것을 활용하고 싶습니다.
CLR은 시작하기 위해 기본 최대 메모리로 제한합니까? 추가 요청은 어떻게합니까?
최신 정보
나는 이것을 더 작은 덩어리로 나누고 내 메모리 요구 사항에 점진적으로 추가하면 문제가 메모리 조각화 로 인한 경우 도움이 될 것이라고 생각 했지만 blockSize 조정에 관계없이 256MB의 총 ArrayList 크기를 초과 할 수는 없습니다 .
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()));
}
}
내 주요 방법에서 :
int blockSize = 1000000;
while (true) {
try
{
AddNDRandomNumbers(blockSize);
}
catch (System.OutOfMemoryException ex)
{
break;
}
}
double arrayTotalSizeInMegabytes = (ndRandomNumbers.Count * 8.0) / 1024.0 / 1024.0;