我正在编写一个需要大量内存的程序(大图分析)。
目前我的程序中有两个主要的数据结构(占用大部分内存)。这些是:
int **
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。
感谢。
答案 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字节。然后矩阵的总内存使用量将翻倍。