1

我正在尝试在 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;
}

对 new 的调用失败,但 int * test = new int[t/7];成功。

再调查一下,我发现内存分配仅使用资源监视器指定为“空闲”的内存。因此,当这小于请求的分配时,分配失败。资源监视器告诉我(当我查看时)我有大约 5GB 正在使用,大约 10GB 处于待机状态,还有超过 1GB 的空闲空间。

据我了解,这不应该发生。当然,如果请求内存,它应该从备用内存中取出吗?如果不是这种情况,那么有没有办法从 C++ 内部减少 Windows 使用的备用内存量?

后者可以使用 RAMMap 在 C++ 之外完成,正如我从这篇文章中发现的那样:以编程方式清除 Windows 7 备用内存,但不幸的是,对于编程清除的问题没有有用的答案。也许我在 C++ 中比较幸运。

当然,更有可能的情况是我错过了一些明显的东西。

谢谢

4

2 回答 2

2

请记住,当您在堆上分配时,该内存必须是一个连续的块。如果内存是碎片化的,则可能没有足够大的块来容纳分配,即使可用内存的总量远大于您的请求。

于 2013-07-03T05:44:11.930 回答
1

内存碎片可能是问题之一:您可以有这么多的可用内存,但它不是连续的。

更好的方法是分配相当大的内存块(几兆字节)并将它们链接列表。您为这样一个块(以及每个块)找到空间的概率远高于为几个 GB 找到连续空间的概率。

就性能而言:只要您只处理一个块,您就不会因为数据保留在 CPU 缓存中而失去速度。如果您经常在两个块之间切换(例如,在它们之间交换项目),您将获得缓存未命中。

无论如何,清除内存之类的任何解决方法都像扑克一样:你可能会得到一个块,也可能不会。这取决于太多你无法控制的因素。

于 2013-07-03T05:48:43.880 回答