Dimensione dell'array che Fortran in grado di gestire
-
22-10-2019 - |
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
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.