forrtl:严重(179):无法分配数组 - 数组大小计算溢出

Posted

技术标签:

【中文标题】forrtl:严重(179):无法分配数组 - 数组大小计算溢出【英文标题】:forrtl: severe (179): Cannot allocate array - overflow on array size calculation 【发布时间】:2013-09-15 15:42:54 【问题描述】:

我正在尝试在我的笔记本电脑(Linux 3.8.0-25-generic x86_64,Ubuntu 13.04)上运行一个模拟程序。

它可以编译,但是在分配一些数组大小时,我得到了:

forrtl: 严重 (179): 无法分配数组 - 数组大小计算溢出。\

Some googling about this message 让我得出结论,这是因为我的程序内存不足而生成的。

为了检查这个假设,我尝试为同一个数组分配一个较小的维度,但仍然遇到同样的问题。

我接下来尝试的是增加堆栈内存,但仍然遇到同样的问题。

这是代码:

program memoria

implicit none

integer :: n,num
complex, dimension(:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:), allocatable :: ddptrj

n=4

num=21


allocate(ddptrj(n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,num))

deallocate(ddptrj)


endprogram memoria

我该如何解决这个问题?

【问题讨论】:

我的猜测是,如果您试图为工作使用超过 1 PB 的内存,那么您在物理/数学上做错了。 我想指出的是,对 Fortran 数组使用 20 多个维度确实是个坏主意,即使您的编译器允许这样做。代码将不可读。您确实需要使用低维数组并实现自己的索引方案。 是什么让您认为您需要 22 个维度和 1344TB 来解决您的问题?这一定是一个非凡的问题,或者它的设计非常糟糕......你应该首先解释你想要做什么。 【参考方案1】:

Fortran 2008 标准定义了maximum rank of 15。 ifortallows 31。截至May 2013 ,gfortran 仍然不支持超过 7 个维度。所以 - 如果您真的需要所有 22 维,请使用 ifort - 但请注意,此功能是标准的扩展,其他编译器可能无法编译您的代码。

编辑:总结 cmets 中的讨论:

有两个问题 - 一个与最大维度有关,另一个与数组大小有关。

对于不允许 22 维的编译器,可以使用一个包含所有元素的 1 级大数组,并使用 strides 自己计算元素内部的索引。

在内部,所有数组都连续存储在内存中 - 可以将其视为 一个大数组,大小为 N*M*... Fortran 实际上存储 以列主要格式生成的数组。所以存储了一个矩阵 Z(NxM) 作为向量 A(N*M),并且对元素的访问由下式计算 步幅:Z(3,4) 位于索引 A( M*(4-1)+3 )。注意内存是 两个数组都一样!

下一个问题是数组大小:

对于 n=2,代码有效,因为它适合内存: 2**21*21=44040192 在复杂(16 字节)这相当于 672 MB。在 n=4 这变成了 4**21*21,即 1344TB。

【讨论】:

“但请注意,标准未涵盖此内容”是什么意思? 您可能无法使用没有此特定扩展名的编译器对其进行编译。 如果你是我的情况,你会怎么做?我需要 22 维 您可以使用一个包含所有元素的排名为 1 的大型数组(尽管在您的示例中它将达到 1344TB)并使用步幅自己计算元素内的索引。除此之外 - 尝试简化您的问题。你真的需要这么多维度吗? 我想我确实需要所有这些。你是物理学家吗?【参考方案2】:

如果您使用的方法需要 22 维,那么您几乎肯定需要更改算法。正如人们在其他地方所指出的那样,您不仅会使用大量内存,而且如果您想对该数组中的所有元素执行某些操作,运行时本身也会变得非常庞大。

因为您使用的是 Fortran,所以我猜您正在查看某种具有 22 维的参数空间,并记录每个参数组合的拟合优度或可能性。在这种情况下,您应该考虑使用其他算法(例如 MCMC)来探索空间。

但这只是一个猜测——如果你告诉我们你试图解决什么潜在的问题,人们可能会有更多的建议。

【讨论】:

以上是关于forrtl:严重(179):无法分配数组 - 数组大小计算溢出的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 45. 把数组排成最小的数-排序(179. 最大数)

Forrtl: severe(157): Program Exception - access violation

179 Largest Number 把数组排成最大的数

Leetcode--179--Largest Number

leetcode179-Largest Number(把数组排成最大的数)

[LeetCode] 179. Largest Number