Fortran中分配数组大小
用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中分配数组大小相关推荐
- c语言不能在函数中求数组大小,C语言中数组长度不能用变量定义吗?
翻翻过去那场雪 1.C语言中不支持.C++中支持变长数组(你可以自行度娘变长数组和alloca函数),但是因为其实在栈上分配,不被推荐使用.做为解决方案,你可以使用C式的malloc函数或者C++式的 ...
- FPGA的设计艺术(18)如何使用Verilog中的数组对存储器进行建模?
前言 Verilog中的二维数组很有用,可以使用for以及generate for配合二维数组进行使用,可以代替大量寄存器的场合,其实大量同类寄存器可以使用存储器进行代替,Verilog中可以使用二维 ...
- nginx中的数组结构ngx_array_t
nginx中的ngx_array_t类似于c语言中的数组,其是基于内存池动态分配的.主要包含在文件src/core/ngx_array.h和/src/core/ngx_array.c两个文件中. 1. ...
- C语言实现动态数组大小
C语言动态数组大小 C语言中的数组大小是固定的,定义的时候必须要给一个常量值,不能是变量.这带来了很大的不便,如果数组过小,不能容下所有数组,如果过大,浪费资源. //C语言动态分配数组大小 #inc ...
- c语言文本按行分配数组元素,【转】C语言中动态分配数组
int main() { int i = 0; int *a; int N; printf("Input array length: "); scanf("%d" ...
- 数组大小分配(动态内存分配)
在使用数组的时候,总是有一个问题,数组应该有多大? 在很多情况下,我们无法确定要使用多大的数组.一般申请大于估计数目的固定大小,这样程序在运行时就申请了固定的大小,你觉得数组定义足够大,但是如果某种原 ...
- 全局分配数组、栈分配数组、堆分配数组在IDA反汇编中的不同——《IDA权威指南》例子尝试
数组不同分配方式对比 概述 例子 1.全局分配的数组 2.栈分配的数组 3.堆分配数组 总结 概述 本文例子均来自<IDA PRO 权威指南>第八章第一节 阅读前需要掌握基本的汇编指令 例 ...
- 在malloc函数中为什么常用sizeof来设定内存分配的大小?
在malloc函数中为什么常用sizeof来设定内存分配的大小? 例子:为40个整数变量分配内存并赋值,然后系统在收回这些内存. #include<stdlib.h> #include&l ...
- 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明...
[VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...
- java数组创建后大小能改变吗,在Java中,数组创建成功以后,其大小(??? )(能/不能)改变...
在Java中,数组创建成功以后,其大小(??? )(能/不能)改变 答: 不能 新民主主义革命最基本的动力是(). 答:中国无产阶级 病人,男性,36岁.尿蛋白(++++),全身水肿1个月,测血压16 ...
最新文章
- 记录安装php与apache不兼容的过程
- 阿里云智能总裁张建锋:保护客户数据安全是第一原则
- Android开发笔记(一百七十五)利用Room简化数据库操作
- 图解25匹马的选马问题
- 组合数学 - 母函数的运用 + 模板 --- hdu : 2082
- 30+免费快速启动工具软件下载
- openwrt 添加usb网卡_【沙发管家】路由器USB接口的用处你真的了解么?
- Unity-TA 成长之路(二)内置渲染管线-官方篇
- 格雷码与二进制之间转换及VHDL实现
- A股各概念板块龙头股大全
- 云烟成雨,我多想再见你,
- 【Zoomit】的安装及使用方法
- netty编解码之jboss marshalling
- 【开关电源五】电源拓扑之全桥、半桥、推挽
- [附源码]java毕业设计家政管理系统
- C语言路漫漫,其修远兮
- Flash 游戏制作一些资源
- matlab 冒号范围,MATLAB中冒号的用法
- ggplot 直方图(histogram)
- VMware虚拟机安装Windows2008详细过程
热门文章
- Gym - 100781A Adjoin the Networks (树的直径)
- 台式计算机快捷键大全,台式电脑截图快捷键是哪一个?(电脑快捷键使用大全)...
- Windows7不停弹出计算机界面,拨号连接自动弹出,教您如何解决电脑总是自动弹出...
- Zookeeper,集群管理之独孤求败
- DRAM存储系统结构
- 论文总结——SIPaKMeD宫颈细胞Pap涂片数据集
- 请同学检查地址是否有误:CSDN博客地址汇总(网络121、网络131、计科1111-1114)
- 2021.09青少年软件编程(Python)等级考试试卷(五级)
- 【笔记】HEFT——面向异构计算的高性能、低复杂度任务调度
- 公司内部分享【富有成效的每日站会】总结