这是我的代码:
int size = 100000000;
double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb
double[] randomNumbers = new double[size];
Exception: Exception of type ‘System.OutOfMemoryException’ was thrown.
I have 4GB memory on this machine 2.5GB is free当我开始运行时,电脑上显然有足够的空间来处理 762MB 的 100000000 个随机数。
Does the CLR constrain me to a default max memory to start with? and how do I request more?
Update
我认为如果问题是由于以下原因造成的,将其分成更小的块并逐渐增加我的内存需求会有所帮助memory fragmentation ,但事实并非如此I can’t get past a total ArrayList size of 256mb regardless of what I do tweaking blockSize。
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;
答案
您可能想阅读以下内容:"“内存不足"并不是指物理内存“埃里克·利珀特。
简而言之,非常简单,“内存不足"并不真正意味着可用内存量太小。
Key Points:
- 在我看来,我们称之为"进程内存"的数据存储最好可视化为massive file on disk。
- RAM 可以看作仅仅是性能优化
- 程序消耗的虚拟内存总量与其性能实际上并没有太大关系
- “RAM 不足"很少会导致"内存不足"错误。