【发布时间】:2010-11-12 07:51:28
【问题描述】:
这是我的代码:
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 上显然有足够的空间来处理 100000000 个随机数的 762mb。给定可用内存,我需要存储尽可能多的随机数。当我投入生产时,盒子上会有 12GB 的空间,我想利用它。
CLR 是否将我限制在默认的最大内存开始?以及如何要求更多?
更新
我认为如果问题是由于内存碎片造成的,我认为将其分成更小的块并逐渐增加我的内存需求会有所帮助,但它没有我无法通过ArrayList 的总大小为 256mb,无论我如何调整 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;
【问题讨论】:
-
我建议重新构建您的应用程序,这样您就不必使用太多内存。你在做什么需要同时在内存中存储一亿个数字?
-
你没有禁用你的页面文件或类似的傻事,对吧?
-
@EricLippert,我在处理 P 与 NP 问题 (claymath.org/millenium-problems/p-vs-np-problem) 时遇到了这个问题。你有减少工作内存使用的建议吗? (例如,在硬盘上序列化和存储大块数据,使用 C++ 数据类型等)
-
@bosit 这是一个问答网站。如果您对实际代码有特定的技术问题,请将其作为问题发布。
-
@bostIT 您评论中 P 与 NP 问题的链接不再有效。
标签: c# memory-management out-of-memory