我正在使用Fortran90代码,该代码适用于小型数组。不幸的是,如果数组太大,程序在分配数组时会返回错误:严重(41):虚拟内存不足。
我拥有的是:
real*8, allocatable :: M(:,:), C(:,:), K(:,:)
real*8, allocatable :: t(:)
real*8, allocatable :: X(:,:), DX(:,:), D2X(:,:)
real*8, allocatable :: R(:,:)
integer*4 :: nx, nt
integer :: io_stat
...
nx = 15
nt = 6000001
...
allocate(M(nx,nx), C(nx,nx), K(nx,nx),stat=io_stat)
if(io_stat) stop
allocate(t(nt),stat=io_stat)
if(io_stat) stop
allocate(X(nx,nt),DX(nx,nt),D2X(nx,nt),R(nx,nt),stat=io_stat)
if(io_stat) stop
...
nt 参数是根据我想要在计算中使用的时间增量计算的,并且此时间增量必须非常小(1e-9或更小)才能使结果收敛。如果nt=600001
,程序运行正常,但结果不准确。问题是:我不能增加阵列的大小,因为程序不能分配我使用的所有阵列(当试图分配DX阵列时,程序已经停止)。这些不是代码中唯一的数组,只是重要的(大)数组。
我使用的是英特尔(R)Visual Fortran编译器专业版11.1和Microsoft Visual Studio 2008版本9.0.21022.8 RTM。 我在Windows 8,64位,16 GB RAM内存中运行代码。 但是,Build - > Configuration Manager设置为Win32 Platform,因为我使用的是必须在此平台上运行的库(我无法将其更改为x64平台)。
我想知道如何增加虚拟内存,因此我可以使用适当的离散化运行我的代码,即我需要更多内存来分配我的所有数组。怎么做?
P.S。我在Matlab上运行了类似的代码,它生成了近2GB的数据(X,DX和D2X阵列,这是我想要的结果)。但我有16GB的ram,所以我认为计算机的内存不是问题,而是编译器/代码。我是对的吗?
答案 0 :(得分:0)
一般来说,您需要确保: