0

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

(机器配置:VM 机器 Ubuntu 10.4,gcc 4.4.3,32bit,2GB ram(虽然我的主机是 6gigs)

1.我将数组声明为'unsigned long int',大小为1 * 10 ^ 9。它在编译代码时不起作用,我收到错误“数组大小太长”。所以我搜索了这个,最后意识到我不能在堆栈上分配那么多内存,因为我的物理内存是 2 GB。我已经尝试将数组分配为全局变量,这会将它们分配在全局区域而不是堆栈中,但同样的错误

  1. 因此,我尝试使用“malloc”分配相同数量的内存,但这次“无法分配内存”再次出现“malloc”错误

因此,在完成所有这些之后,我的理解/问题如下:

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

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

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

非常感谢PS如果我是新手请原谅我..

4

1 回答 1

3

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

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

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

于 2012-04-20T17:31:46.210 回答