以下是我的代码:
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上有足够的空间来处理1亿个随机数中的762MB。我需要尽可能多地存储随机数,以便利用可用内存。在生产环境中,该计算机将拥有12GB内存,我希望能够利用它。
CLR是否限制了我默认的最大内存?如何请求更多内存?
更新
如果问题是由于内存碎片化引起的,我认为将其分成较小的块并逐步增加内存需求会有所帮助,但事实并非如此。无论我如何调整块大小,我都无法超过总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;