これは私のコードです:
int size = 100000000;
double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb
double[] randomNumbers = new double[size];
例外: タイプ 'System.OutOfMemoryException' の例外がスローされました。
このマシンには 4GB のメモリがあります。この実行を開始すると 2.5GB が空いています。PC には明らかに 762MB の 100000000 の乱数を処理するのに十分なスペースがあります。利用可能なメモリを考慮して、できるだけ多くの乱数を保存する必要があります。生産に行くと、ボックスに 12GB あり、それを利用したいと考えています。
CLR は、最初からデフォルトの最大メモリに制限していますか? どうすればもっとリクエストできますか?
アップデート
問題がメモリの断片化によるものである場合、これを小さなチャンクに分割し、メモリ要件を段階的に追加すると役立つと思いましたが、 blockSize を微調整しても、 ArrayList の合計サイズ 256mb を超えることはできません。
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;