我有30000个文件来处理每个文件有80000 x 5行。我需要读取所有文件并处理它们以查找每行的平均值。我编写了代码来读取和提取文件中的所有数据。我的代码在Fortran中。有一个(30000 X 800000)阵列我的程序无法通过(3300 X 80000)。我需要在300个文件步骤中添加每个文件的第4列,我的意思是第一个文件的第4列,第301个文件的第4列,第2个文件的第4个列,第2个第302个文件,依此类推。你认为这是因为Fortran可以处理的数组大小的限制?如果是这样,有没有办法增加Fortran可以处理的数组的大小?没有文件怎么样?我的代码看起来像这样: 这个程序运行良好。
implicit double precision (a-h,o-z),integer(i-n)
dimension x(78805,5),y(78805,5),den(78805,5)
dimension b(3300,78805),bb(78805)
character*70,fn
nf = 3300 ! NUMBER OF FILES
nj = 78804 ! Number of rows in file.
ns = 300 ! No. of steps for files.
ncores = 11 ! No of Cores
c--------------------------------------------------------------------
c--------------------------------------------------------------------
!Initialization
do i = 0,nf
do j = 1, nj
x(j,1) = 0.0
y(j,2) = 0.0
den(j,4) = 0.0
c a(i,j) = 0.0
b(i,j) = 0.0
c aa(j) = 0.0
bb(j) = 0.0
end do
end do
c-------!Body program-----------------------------------------------
iout = 6 ! Output Files upto "ns" no.
DO i= 1,nf ! LOOP FOR THE NUMBER OF FILES
write(fn,10)i
open(1,file=fn)
do j=1,nj ! Loop for the no of rows in the domain
read(1,*)x(j,1),y(j,2),den(j,4)
if(i.le.ns) then
c a(i,j) = prob(j,3)
b(i,j) = den(j,4)
else
c a(i,j) = prob(j,3) + a(i-ns,j)
b(i,j) = den(j,4) + b(i-ns,j)
end if
end do
close(1)
c ----------------------------------------------------------
c -----Write Out put [Probability and density matrix]-------
c ----------------------------------------------------------
if(i.ge.(nf-ns)) then
do j = 1, nj
c aa(j) = a(i,j)/(ncores*1.0)
bb(j) = b(i,j)/(ncores*1.0)
write(iout,*) int(x(j,1)),int(y(j,2)),bb(j)
end do
close(iout)
iout = iout + 1
end if
END DO
10 format(i0,'.txt')
END
答案 0 :(得分:2)
很难说是肯定的,因为你还没有提供所有的细节,但你的问题很可能是你使用32位编译器生成32位可执行文件,而你只是用完地址空间。
虽然您的操作系统支持64位地址空间,但您的32位进程仍限制为32位地址。
你发现3300 * 78805 * 8的限制不到2GB,这支持了我的理论。
无论您遇到直接问题的原因是什么,您的根本问题在于您似乎立即将所有内容加载到内存中。我没有仔细研究过你的算法,但是在第一次检查时,你可能会重新安排它,以避免一下子将所有内容都存在。