gcc的大数组声明及其问题

时间:2012-04-20 17:26:45

标签: c memory-management

我正在编写一个代码,需要分配大'int'数组(大小为10 ^ 9 )。 虽然这样做我遇到了几个问题,在阅读了Google上的内容后,我得出了自己的结论。有人可以看到这一点,并指出我是否遗漏了一些东西,并建议更好的方法来做到这一点。

(机器配置:VM机器Ubuntu 10.4,gcc 4.4.3,32位,2GB内存(虽然我的主机为6gigs)

1.我将数组声明为'unsigned long int',大小为1 * 10 ^ 9. 它没有像编译代码那样工作我得到错误'数组大小太长了'。 所以我搜索了这个并最终意识到我无法在堆栈上分配那么多内存,因为我的物理内存是2 GB。我已经尝试将数组分配为全局变量,它将分配它们在全局区域而不是堆栈,但相同的错误

  1. 所以我尝试使用'malloc'分配相同数量的内存但是这次'malloc'再次出现错误'无法释放内存'
  2. 因此,在完成所有这些后,我的理解/问题如下:

    3-我无法分配那么多的内存,无论是堆栈还是堆,因为我的物理内存仅为2Gb (所以这是实际问题还是其他一些因素也会影响这个内存分配?)

    4-是否有任何可行的解决方法,我可以在2gig机器上分配大小为10 ^ 9的内存(我知道分配一个数组或内存区域这么大,既不是好的算法设计也不是高效但我只是想知道限制。)

    5-分配这么多内存的任何更好的解决方案(我的意思是我应该使用2个小数组/堆mem而不是一个大块) (注意:第4点和第5点是两种不同的方法我会赞赏这两种方法的建议)

    非常感谢 如果我是新手,请原谅我。

1 个答案:

答案 0 :(得分:3)

您正在编译32位进程,而且您的庞大数据块的物理地址空间不足。 32位指针可以容纳2 ^ 32个不同的值,即4GB。你不能分配更多,因为你无法引用内存。映射到进程的每个内存字节都必须具有唯一的地址。

因此,没有任何东西可以使您的数据适合4GB的地址空间。即使您的阵列小于4GB,您也可能在分配单个连续内存块时遇到问题。

您可以使用64位进程,但是您需要确保有足够的物理内存以避免在交换阵列时磁盘抖动。或者你可以找到一个不需要如此庞大的内存块的不同算法。