0

我有 30000 个文件来处理每个文件有 80000 x 5 行。我需要读取所有文件并处理它们以找到每行的平均值。我已经编写了代码来读取和提取文件中的所有数据。我的代码在 Fortran 中。有一个数组 (30000 X 800000) 我的程序无法超过 (3300 X 80000)。我需要在 300 个文件步骤中添加每个文件的第 4 列,我的意思是第 1 个文件的第 4 列和第 301 个文件的第 4 列,第 2 个文件的第 4 列和第 302 个文件的第 4 列等等。你认为这是因为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 
4

1 回答 1

2

很难确定,因为您还没有提供所有详细信息,但是您的问题很可能是您正在使用生成 32 位可执行文件的 32 位编译器,而您只是用完了地址空间。

尽管您的操作系统支持 64 位地址空间,但您的 32 位进程仍然仅限于 32 位地址。

您发现了 3300*78805*8 的限制,略低于 2GB,这支持了我的理论。

无论您的直接问题的原因是什么,您的根本问题是您似乎一次将所有内容加载到内存中。我没有仔细研究过您的算法,但在第一次检查时,您似乎可以重新安排它以避免一次将所有内容都存储在内存中。

于 2011-03-16T14:20:43.443 回答