最近,我在C ++工作,我必须创建一个array[60.000][60.000]
。但是,我无法创建此数组,因为它太大了。我尝试了float **array
甚至static float array
,但没有什么是好的。有没有人有想法?
谢谢你的帮助!
答案 0 :(得分:16)
大小为60,000 x 60,000
的矩阵有3,600,000,000
个元素。
您正在使用类型float
,因此它变为:
60,000 x 60,000 * 4 bytes = 14,400,000,000 bytes ~= 13.4 GB
你的机器中甚至有那么多记忆吗?
请注意,堆栈与堆的问题甚至不重要,除非你有足够的内存开始。
以下列出了可能存在的问题:
答案 1 :(得分:2)
“60.000”实际上是指“60000”吗?如果是这样,所需内存的大小为60000 * 60000 * sizeof(float)
,大约为13.4 GB。典型的32位进程仅限于2 GB,因此很清楚它为什么不适合。
另一方面,假设您的计算机有足够的RAM,我不明白为什么您不能将其纳入64位进程。
答案 2 :(得分:1)
要初始化所需的2D浮点数组,您需要:
60000 * 60000 * 4字节= 14400000000字节
大约14GB的内存。那是很多记忆。为了在理论上保持这一点,你需要运行64位机器,更不用说安装了相当多RAM的机器。
此外,在大多数情况下几乎不需要分配这么多内存,你确定在这里不能进行优化吗?
编辑:
根据您对其他答案的评论中的新信息:您只有4GB内存(RAM)。因此,您的操作系统必须在硬盘驱动器上至少打印9GB,实际上可能更多。但是你也只有20GB的硬盘空间。这几乎不足以分页所有数据,尤其是在磁盘碎片化的情况下。最后,(我可能是错的,因为你没有明确说明)你很可能正在运行32位机器。这不能真正处理超过4GB的内存。
答案 3 :(得分:1)
在运行时分配内存 - 考虑使用内存映射文件作为后备。就像每个人都说的那样,14演出是很多记忆。但找到一台内存为14GB的计算机并不是不合理的,在必要时分页内存也不合理。
使用这种大小的矩阵,您可能会对内存访问性能非常好奇。请记住考虑目标体系结构的缓存粒度,如果您的目标有TLB,您可以使用更大的页面来减轻TLB的压力。再说一次,如果你没有足够的内存,你可能只关心你的存储I / O有多快。
如果还不是很明显,那么你需要一个支持64位地址空间的架构,以便直接/方便地访问这个内存。
答案 4 :(得分:0)
我也有这个问题。我做了一个解决方法,我把数组切成了几个部分(我最大的允许数组是 float A_sub_matrix_20 [62944560] )。当我在main()中声明其中一个时,它似乎被放入RAM中,因为我在main()启动时得到了一个运行时异常。我能够声明那个大小的 20 缓冲区作为全局变量工作(看起来像全局形式它们存储在HDD上 - 当我将A_sub_matrix_20 [n]添加到VisualStudio中的监视列表时消息"从文件中读取" )。