首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用大内存块Windows 7

如何使用大内存块Windows 7
EN

Stack Overflow用户
提问于 2013-07-03 13:39:17
回答 2查看 897关注 0票数 1

在Windows7专业版下,我正在尝试分配一大块内存(5 5GB)。我有一台64位的机器和16 be的RAM,我使用的是MS Visual Studio 10。对于那些可能会问为什么的人来说,这是因为我需要保存多边形数据的参考号的2-D栅格表示,这些地图可以达到40,000 x 40,000个单位。这必须放入RAM中,并且在运行时将其分成更小的块的代价太高。

所以如果我这样做:

代码语言:javascript
复制
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];成功。

进一步调查后,我发现内存分配只使用了被资源监视器指定为“空闲”的内存。因此,当该值小于请求的分配时,分配将失败。资源监视器告诉我(当我查看时)我有大约5 1GB的空间在使用,大约10 1GB处于待机状态,还有1 1GB多一点的空闲空间。

据我所知,这不应该发生。当然,如果请求内存,它应该从备用内存中取出?如果不是这样,那么有没有办法从C++内部减少windows使用的备用内存量?

后者可以在C++之外使用RAMMap完成,正如我在这篇文章中发现的:Clear the windows 7 standby memory programmatically,但不幸的是,对于编程清除的问题,没有有用的答案。也许我在C++中更幸运。

当然,更有可能的情况是,我只是遗漏了一些显而易见的东西。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-07-03 13:44:12

请记住,当您在堆上分配时,该内存必须是一个连续的块。如果内存是碎片化的,那么即使空闲内存的总量远远大于您所请求的内存,也无法等待足够大的块来容纳分配。

票数 2
EN

Stack Overflow用户

发布于 2013-07-03 13:48:44

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

一种更好的方法是分配相当大的内存块(几兆字节)并将它们链接到列表中。找到这样一个块(以及每个块)的空间的概率比找到几of的连续空间的概率要高得多。

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

无论如何,像清除内存这样的变通方法就像扑克一样:你可能会得到一大块,也可能没有。这取决于太多你无法控制的因素。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17440478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档