Размер массива, который может обрабатывать Фортран - PullRequest
0 голосов
/ 14 марта 2011

У меня 30000 файлов для обработки, каждый файл имеет 80000 х 5 строк. Мне нужно прочитать все файлы и обработать их, находя среднее значение каждой строки. Я написал код для чтения и извлечения всех данных из файла. Мой код в Фортране. Имеется массив (30000 X 800000). Моя программа не может завершиться (3300 X 80000). Мне нужно добавить 4-й столбец каждого файла за 300 шагов, я имею в виду 4-й столбец 1-го файла с 4-м столбцом 301-го файла, 4-й столбец 2-го файла с 4-м столбцом 302-го файла и т. Д. Вы думаете, что это потому, что ограничения размера массива, который может обрабатывать Фортран? Если так, есть ли способ увеличить размер массива, который может обрабатывать Фортран? Как насчет нет файлов? Мой код выглядит так: Эта программа работает хорошо.

    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 

1 Ответ

2 голосов
/ 16 марта 2011

Трудно сказать наверняка, потому что вы еще не дали всех подробностей, но ваша проблема, вполне возможно, в том, что вы используете 32-битный компилятор, производящий 32-битные исполняемые файлы, и у вас просто не хватает адресного пространства.

Хотя ваша операционная система поддерживает 64-разрядное адресное пространство, 32-разрядный процесс по-прежнему ограничен 32-разрядными адресами.

Вы обнаружили ограничение в 3300 * 78805 * 8, которое составляет чуть менее 2 ГБ, и этоподдерживает мою теорию.

Независимо от того, что является причиной вашей непосредственной проблемы, ваша фундаментальная проблема заключается в том, что вы, кажется, загружаете все в память одновременно.Я не очень внимательно изучил ваш алгоритм, но при первом осмотре кажется вероятным, что вы могли бы перестроить его, чтобы избежать одновременного хранения всего в памяти.

...