Размер массива, с которым может справиться Фортран

StackOverflow https://stackoverflow.com/questions/5301551

  •  22-10-2019
  •  | 
  •  

Вопрос

У меня есть 30000 файлов для обработки каждого файла составляет 80000 x 5 строк. Мне нужно прочитать все файлы и обработать их поиск среднего значения каждой строки. Я написал код для чтения и извлечения всех данных из файла. Мой код в Фортране. Существует массив (30000 x 800000), моя программа не могла пройти (3300 x 80000). Мне нужно добавить 4 -й столбец каждого файла в 300 шагах файлов, я имею в виду 4 -й столбец 1 -го файла с 4 -м столбцом из 301 -го файла, 4 -й COL 2 -го файла с 4 -м COL 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 
Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top