限制内存分配在Windows +我正在计算这个正确?

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

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

  • int **types的* nmatrix
  • 和长度为n的数组,typesNode *

在这种情况下,节点是一个包含两个整数的结构( 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的空闲RAM。

谢谢。

Solutions Collecting From Web of "限制内存分配在Windows +我正在计算这个正确?"

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

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

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

你很可能编译为32位; 在Windows上,32位进程被限制为2G可寻址空间( 使用64位操作系统,IMAGE_FILE_LARGE_ADDRESS_AWARE标志设置为4GB )。 编译为64位,你应该看到你的内存限制大幅上升。 但是,在这样做之前,您可能需要更多的物理RAM; 你已经使用了它的一半,打交换将杀死你的表现。

32位进程被限制在2G用户可访问的内存(在大多数版本的Windows默认设置)。 64位进程有更大的地址空间。 看到这个笔记性能和内存消耗在WOW64下为32位应用程序提供一个4G地址空间的方法(不知道GCC是否能够/如何使用那个标志来设置可执行映像)。

把你的代码编译成一个64位的应用程序,这个限制应该消失(试试MinGW-w64 )。

要避开内存限制,必须以64位模式编译程序; 注意指针的大小是8字节。 矩阵的总内存使用量将会翻倍。