Domanda

Ho 30000 file da elaborare ogni file ha 80000 x 5 linee. Ho bisogno di leggere tutti i file ed elaborarli trovare la media di ogni linea. Ho scritto il codice per leggere ed estrarre tutti i dati dal file. Il mio codice è in Fortran. C'è una serie di (30000 X 800000) Il mio programma non poteva andare oltre (3300 X 80000). Ho bisogno di aggiungere il 4 ° colonna di ogni file in 300 gradini di file, voglio dire 4a colonna della prima file con 4 ° colonna del file di 301 °, 4 ° Col del 2 file con 4 COL del 302o di file e così via .Non si pensa che questo sia perché della limitazione della dimensione della matrice che Fortran può gestire? In tal caso, non v'è alcun modo per aumentare la dimensione della matrice che Fortran può gestire? Che dire il no di file? Il mio codice è simile al seguente: Questo programma viene eseguito bene.

    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 
È stato utile?

Soluzione

E 'difficile dire con certezza perché non hai ancora dato tutti i dettagli, ma il problema è molto probabilmente che si sta utilizzando un 32 bit compilatore produrre 32 eseguibili bit e si sono semplicemente a corto di spazio di indirizzi.

Anche se il vostro sistema operativo supporta spazio di indirizzamento a 64 bit, il processo a 32 bit è ancora limitata a 32 indirizzi bit.

Hai trovato un limite a 3300 * 78.805 * 8 che è poco meno di 2 GB e questo supporta la mia teoria.

Non importa quale sia la causa del problema immediato, il problema fondamentale è che sembrano essere il caricamento in memoria tutto in una volta. Non ho studiato da vicino il vostro algoritmo, ma prima ispezione sembra probabile che si potrebbe ri-organizzare per evitare di avere tutto in memoria in una sola volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top