gpt4 book ai didi

c - gcc 的大数组声明及其问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:34:26 25 4
gpt4 key购买 nike

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

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

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

  1. 所以我尝试使用“malloc”分配相同数量的内存,但这次再次遇到“malloc”错误“无法分配内存”

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

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

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

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

非常感谢P.S 如果我是新手,请原谅我..

最佳答案

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

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

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

关于c - gcc 的大数组声明及其问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10250766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com