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