用Fortran写程序经常会分配一些数组使用,但究竟能分配多大的数组,这受编译环境、电脑可用内存容量、数组分配方式的影响,做了些测试,分享一下。

操作系统:Win8.1 64位

内存:8G(由于集成显卡需要使用一部分内存,实际可用内存7.7G)

编译器:Intel(R) Visual Fortran Composer XE 2013 SP1 Update 3(Visual Fortran Compiler XE 14.0.3.202)+Visual Studio 2010

其它:整型、实型均采用系统默认设置(整型4字节,实型8字节)

一、固定数组分配方式

早期的Fortran程序多使用parameter来定义一个静态变量,然后用此静态变量来进行数组大小定义,这里称此为固定数组分配方式。典型代码如下,本次测试也使用以下代码:

!===========分割线=================

program TestArray

implicit none

integer,parameter::n=489000000    !静态数组

real a(n)

a=0.0

end program TestArray

!===========分割线=================

在这个代码中只需要修改n的数值,就可以更改数组大小。测试时操作系统和其它应用程序已经占用电脑3.6G内存,系统可用内存为7.7-3.6=4.1G。测试了Win32和Win64两种编译器得到的程序,得到如下结果

Win32位:最大数组元素为48.9千万个(忽略百万以下数据,下同)

Win64位:最大数组元素为49.6千万个(当为53.6千万个时也能编译,但无法执行程序)

因此,固定数组分配方式下,32位和64位程序似乎差异不大。找了些资料大概看了一下,说是Fortran对单个数组的分配空间不能超过1G,没有再进一步核实。但若果真如此,那也说明32位和64位没有影响了,因为二者在1G内存空间内寻址都是没有问题的。此种分配方式下,电脑内存没有用完。

二、动态数组分配方式

自Fortran90以来,利用allocatable使用动态数组是非常方便的,因此,再测试一下此种方式分配数组。采用的测试代码如下:

!===========分割线=================

program TestArray

implicit none

integer n,i,k

real,allocatable:: a(:)

n=100000000    !1亿

k=10000000      !1千万

do i=1,50

n=n+k*5   !每次增加5千万

allocate(a(n))

a=0.0

write(*,*)n/k,'千万数据分配成功'

deallocate(a)

end do

end program TestArray

!===========分割线=================

此代码利用一个循环结构,以10千万数组元素为基数,每次增加5千万数组元素,直到内存不足造成程序退出。

(一)Win32位编译执行结果

从图中看出,系统可用内存7.7-3.6=4.1G,直到程序出错退出,内存都没有使用完

Win32位下只分配了40千万个元素就提示虚拟内存不足了,这与固定数组分配方式差不了多少

(二)Win64位编译执行结果

系统可用内存仍然为4.1G,动态数据分配时,随着数组元素增多,内存逐渐增大

在成功分配100千万(10亿)个元素后,再执行一次105千万数组元素分配时提示内存不足。

下面关闭一些应用程序,提高系统可用内存,使可用内存达到7.7-3.1=4.6G

随着数组元素增加,内存使用也在提高

最终110千万(11亿)数组元素成功分配,这是因为系统可用内存增加增加了0.5G。

因此,动态内存分配方式下,在32位模式下,数组的最大元素与固定数组分配差异不大。但在64位模式下,可分配数组的大小远大于固定数组分配方式,其最大数组元素数与系统可用内存有关,可用内存越大,可分配的数组就越大。

三、结论

固定数组定义方式,往往不知道后面需要多大的数组,为了保险期间,就会定义尽可能大的数组,从而造成内存浪费。而在需要更大的数组时,固定数组方式又显得无能为力,定义不出超过4.8亿元素的数组。因此,在进行数组定义时,尽可能的使用allocatable进行动态数组定义,这样可以更合理有效地使用内存。另外,当若需要超大型数组定义时,除了需要系统提供更大的内存外,使用64位编译器编译程序也是必须的。

说明:本测试没有使用硬盘进行虚拟内存,实际实用中若需要较大内存,但系统硬件内存又不够,也可以通过虚拟硬盘空间为内存的方式增加系统可用内存。

Fortran中分配数组大小相关推荐

  1. c语言不能在函数中求数组大小,C语言中数组长度不能用变量定义吗?

    翻翻过去那场雪 1.C语言中不支持.C++中支持变长数组(你可以自行度娘变长数组和alloca函数),但是因为其实在栈上分配,不被推荐使用.做为解决方案,你可以使用C式的malloc函数或者C++式的 ...

  2. FPGA的设计艺术(18)如何使用Verilog中的数组对存储器进行建模?

    前言 Verilog中的二维数组很有用,可以使用for以及generate for配合二维数组进行使用,可以代替大量寄存器的场合,其实大量同类寄存器可以使用存储器进行代替,Verilog中可以使用二维 ...

  3. nginx中的数组结构ngx_array_t

    nginx中的ngx_array_t类似于c语言中的数组,其是基于内存池动态分配的.主要包含在文件src/core/ngx_array.h和/src/core/ngx_array.c两个文件中. 1. ...

  4. C语言实现动态数组大小

    C语言动态数组大小 C语言中的数组大小是固定的,定义的时候必须要给一个常量值,不能是变量.这带来了很大的不便,如果数组过小,不能容下所有数组,如果过大,浪费资源. //C语言动态分配数组大小 #inc ...

  5. c语言文本按行分配数组元素,【转】C语言中动态分配数组

    int main() { int i = 0; int *a; int N; printf("Input array length: "); scanf("%d" ...

  6. 数组大小分配(动态内存分配)

    在使用数组的时候,总是有一个问题,数组应该有多大? 在很多情况下,我们无法确定要使用多大的数组.一般申请大于估计数目的固定大小,这样程序在运行时就申请了固定的大小,你觉得数组定义足够大,但是如果某种原 ...

  7. 全局分配数组、栈分配数组、堆分配数组在IDA反汇编中的不同——《IDA权威指南》例子尝试

    数组不同分配方式对比 概述 例子 1.全局分配的数组 2.栈分配的数组 3.堆分配数组 总结 概述 本文例子均来自<IDA PRO 权威指南>第八章第一节 阅读前需要掌握基本的汇编指令 例 ...

  8. 在malloc函数中为什么常用sizeof来设定内存分配的大小?

    在malloc函数中为什么常用sizeof来设定内存分配的大小? 例子:为40个整数变量分配内存并赋值,然后系统在收回这些内存. #include<stdlib.h> #include&l ...

  9. 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明...

    [VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...

  10. java数组创建后大小能改变吗,在Java中,数组创建成功以后,其大小(??? )(能/不能)改变...

    在Java中,数组创建成功以后,其大小(??? )(能/不能)改变 答: 不能 新民主主义革命最基本的动力是(). 答:中国无产阶级 病人,男性,36岁.尿蛋白(++++),全身水肿1个月,测血压16 ...

最新文章

  1. Python使用matplotlib函数subplot可视化多个不同颜色的折线图、在折线图上为每个数据点添加数值标签
  2. LEMP构建高性能WEB服务器(第三版)
  3. labview如何加载库_迈德威视工业相机LabView 开发指导
  4. Asp.net MVC中的ViewData与ViewBag
  5. Linux stat命令总结
  6. 【Makefile】
  7. UI设计实用素材|闪屏模板
  8. Lync Server 2013视频会议新功能及配置
  9. Selenium-IDE脚本录制,selenium-side-runner自动化测试教程
  10. Spark HA 集群搭建【1、基于文件系统的手动HA 2、基于zk的自动HA】
  11. linux 提示libaio.so.1,libaio.so. 1: 无法打开共享对象文件
  12. 局域网内交换机VLAN隔离设置
  13. RCTF crypto100(1)
  14. python列表的增删查改,已经冒泡,选择,快速排序
  15. 没有互联网的济南,要怎么从冬天走向春天?
  16. English语法_指示代词 -such / the same
  17. uniapp 自定义导航栏 动态显示或隐藏返回图标 以及buttons
  18. SSH-keygen linux教程
  19. Python动态画图小代码(Turtle Graphics)
  20. windows自带截图工具快捷方法

热门文章

  1. 最优投资组合--马科维茨投资组合理论
  2. 古文物青铜器VR高清模型H5三维可视化在线展示
  3. 数学基础二:点到直线距离公式推导
  4. 异常检测时间序列_神经病学时间序列/异常检测:分层时间记忆
  5. lifestyle HTML5酷站欣赏
  6. 微软所有正版软件下载网站ITELLYOU
  7. 2019 秋季最新最全面 JAVA 面试题 附答案
  8. 库房--库存信息增加导出Excel表格功能
  9. APP在推广之渠道为王(三 )
  10. www.skymaya.com:8080/index.php,www_skymaya_com