我正在尝试在Windows 7 Professional下分配一个大块(5GB)的内存。我有一台64位机器和16GB RAM,我正在使用MS Visual Studio 10.对于那些可能会问为什么的人 - 因为我需要将参考数字地图的二维光栅表示保存到多边形数据,地图最高可达40,000 x 40,000单位。这必须进入RAM并将其分解为更小的块在运行时会过于昂贵。
所以,如果我这样做:
int _tmain(int argc, _TCHAR* argv[])
{
int t = INT_MAX;
int * test = new int[t/6];
delete test;
return 0;
}
对新的调用失败,但是
int * test = new int[t/7];
成功。
调查一下我发现内存分配只使用资源监视器指定为“空闲”的内存。因此,当它小于请求的分配时,分配失败。资源监视器告诉我(当我看的时候)我使用了〜5GB,待机时大约10GB,还有1GB以上的空闲。
据我所知,这不应该发生。当然如果请求内存,应该从备用内存中取出?如果不是这种情况那么有没有办法减少Windows内部使用的待机内存量?
后者可以使用RAMMap在C ++之外完成,正如我在这篇文章中发现的那样:Clear the windows 7 standby memory programmatically但不幸的是,对于编程清算问题没有有用的答案。也许我在C ++中更幸运。
当然,更有可能的情况是我错过了一些明显的东西。
由于
答案 0 :(得分:2)
请记住,当您在堆上分配时,该内存必须是一个连续的块。如果内存是碎片化的,那么即使可用内存的总量远大于您的请求,也没有足够大的块来保存分配。
答案 1 :(得分:1)
内存碎片可能是其中一个问题:你可以释放这么多内存,但它不是连续的。
更好的方法是分配相当大的内存块(几兆字节)并对它们进行链接列表。您将为这样的块(以及每个块)找到空间的概率高于您将找到几千兆字节的连续空间的概率。
从性能上看:只要您正在处理一个块,就会因为数据保留在CPU缓存中而没有速度。如果您经常在两个块之间切换(例如,您在它们之间交换项目),则会出现缓存未命中。
无论如何,清理内存等任何变通方法都像扑克一样:你可能会得到一大块。这取决于你无法控制的太多因素。