在Windows中限制内存分配+我是否正确计算?

时间:2011-07-13 18:36:31

标签: c windows memory-management limit

我正在编写一个需要大量内存的程序(大图分析)。

目前我的程序中有两个主要的数据结构(占用大部分内存)。这些是:

  • 类型int **
  • 的n * n矩阵
  • 和长度为n的数组,键入Node *

在这种情况下,Node是一个包含两个整数(sizeof(Node) = 8)

的结构

我可以运行代码的n的最大值是22900,我做了一些计算:

22900*22900 * sizeof(int) * 8 + 22900 * sizeof(Node) = 16782591360 bits

这是1.95375077千兆字节。

问题1:我是否正确计算这两种数据结构的内存使用情况? 和2:Windows上是否有2GB的内存分配限制。如果是这样,我怎么能绕过它?

有关详细信息,我使用的是64位Windows 7计算机,使用GCC编译,4GB内存,运行时可用RAM约为3GB。

感谢。

4 个答案:

答案 0 :(得分:3)

您没有正确计算它。首先,没有理由将任何东西乘以8.C中的分配量是字节,而不是位。其次,你忽略了实现矩阵第一维的指针数组。所以:

22900 * sizeof(int*) + 22900*22900*sizeof(int) + 22900*sizeof(Node) = 2097914800 bytes

至于有用的建议,我会将其留给(已经发布的)其他答案。

答案 1 :(得分:3)

你最有可能编译为32位;在Windows上,32位进程限制为2G的可寻址空间(with a 64-bit OS and the IMAGE_FILE_LARGE_ADDRESS_AWARE flag set, 4GB)。编译为64位,你应该看到你的内存限制大幅上升。但是,在这样做之前,您可能需要更多物理RAM;你已经使用了它的一半而且打交换将会扼杀你的表现。

答案 2 :(得分:2)

32位进程限制为2G的用户可访问内存(在大多数具有默认设置的Windows版本中)。 64位进程具有更大的地址空间。请参阅此说明Performance and Memory Consumption Under WOW64以获取为您的32位应用程序提供4G地址空间的方法(不确定GCC是否/如何构建具有该标志的可执行映像)。

将您的代码编译为64位应用程序,该限制应该消失(尝试MinGW-w64)。

答案 3 :(得分:1)

要解决内存限制,必须以64位模式编译程序;请注意,指针大小为8字节。然后矩阵的总内存使用量将翻倍。