这是我的代码:
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,我都无法超过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;
您可能需要阅读以下内容:Eric Lippert的“ “内存不足”不涉及物理内存 ”。
简而言之,并且非常简化,“内存不足”并不真正意味着可用内存量太小。最常见的原因是,在当前地址空间内,没有连续的内存部分足够大以服务于所需的分配。如果您有100个块,每个块4 MB,那么当您需要一个5 MB块时,这将无济于事。
关键点: