Arrays Fortran内存管理

Arrays Fortran内存管理,arrays,memory-management,fortran,Arrays,Memory Management,Fortran,我在几天内运行了一个模拟代码,因此尝试尽可能减少计算量。对于主模拟,我有8个阵列,带有1.3E+8个条目(256x512 x1024),但每两个小时我就需要进行密集的数据处理,这将在短时间内占用另外200个阵列(!!!)。起初我只使用静态数组,当我超出内存时会产生错误。这就是我不明白的,我想如果发生这种情况,数据会存储在硬盘内存中(这就是我交换的目的) 不管怎样,现在我使用动态分配数组,但我不确定是否正确。 我基本上在开始时分配所有200个数组,在主例程结束时取消分配它们。如果我只在需要阵列时分

我在几天内运行了一个模拟代码,因此尝试尽可能减少计算量。对于主模拟,我有8个阵列,带有1.3E+8个条目(256x512 x1024),但每两个小时我就需要进行密集的数据处理,这将在短时间内占用另外200个阵列(!!!)。起初我只使用静态数组,当我超出内存时会产生错误。这就是我不明白的,我想如果发生这种情况,数据会存储在硬盘内存中(这就是我交换的目的)

不管怎样,现在我使用动态分配数组,但我不确定是否正确。 我基本上在开始时分配所有200个数组,在主例程结束时取消分配它们。如果我只在需要阵列时分配它们,然后立即取消分配它们,会有好处吗?在运行时有好处吗


代码的一点:它是用fortran编写的,并使用ifort+OpenMPI进行编译以实现并行化。我在gentoo上运行它

静态数组倾向于放在堆栈上,堆栈的大小通常是有限的,这就是大数组的问题所在。动态分配的数组放在堆上,堆通常只受计算机容量的限制。分配和解除分配意味着一些运行时成本,但如果您不需要同时使用所有阵列,如果在不再需要阵列之后释放它们,您肯定可以节省内存。我想,分配然后释放阵列以使它们仅在需要时才在内存中的运行时成本与总运行时相比可以忽略不计,但会让您更高效地使用内存。如果您能够保留硬盘上的所有所需内存,您可能会发现这会提高运行时间,因为对磁盘的读/写(通常)非常慢。如果需要很长时间才能运行,您可能希望定期将阵列存储到驱动器上,因此,您要说的是,您通常需要8GB的内存,偶尔会增加到1.6TB的内存。这对于单处理器运行来说是一个巨大的数目,你确定你的机器上有1.6Tbyte交换吗。如果您使用的是MPI,那么显而易见的解决方案是分发阵列。但首先,我会退后一步,仔细考虑我的算法。我真的需要在整个数据处理阶段存储所有200个阵列吗?e、 g.Iyou能从数组的子集或补丁生成中间结果,然后取消分配并处理新的集合吗?@IanBush(256*512*1024*8)/(1024**3)=1GB,如果我没弄错的话,我们正在寻找双精度实数。总共是200GB。虽然这仍然是相当大的,我完全同意关于算法的评论。如果无论如何都不需要同时使用这些数组,那么使用几个临时缓冲区就足够了。。。