Taille du tableau que Fortran peut gérer
-
22-10-2019 - |
Question
Je 30000 fichiers à traiter chaque fichier a 80000 x 5 lignes. Je dois lire tous les fichiers et traiter les trouver à la moyenne de chaque ligne. J'ai écrit le code pour lire et extraire toutes les données du fichier. Mon code est en Fortran. Il y a un tableau de (30000 X 800000) Mon programme n'a pas pu aller plus (3300 X 80000). Je dois ajouter la 4ème colonne de chaque fichier dans 300 étapes de fichier, je veux dire 4ème colonne du 1er fichier avec 4ème colonne du fichier 301e, 4e col du 2ème fichier avec 4 col de fichier 302e et ainsi de suite .Ne vous que ce soit parce que de la limitation de la taille du tableau qui Fortran peut gérer? Si oui, est-il un moyen d'augmenter la taille du tableau qui Fortran peut gérer? Qu'en est-il pas de fichiers? Mon code ressemble à ceci: Ce programme fonctionne bien.
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
La solution
Il est difficile de dire avec certitude parce que vous ne l'avez pas donné tous les détails encore, mais votre problème est tout à fait peut-être que vous utilisez un compilateur 32 bits produisant 32 executables bits et que vous êtes tout simplement à court d'espace d'adresses.
Bien que votre système d'exploitation supports espace d'adressage 64 bits, votre processus 32 bits est encore limité à 32 adresses bits.
Vous avez trouvé une limite à 3300 * 78805 * 8 qui est un peu moins de 2 Go et cela soutient ma théorie.
Peu importe quelle est la cause de votre problème immédiat, votre problème fondamental est que vous semblez être tout de chargement en mémoire à la fois. Je n'ai pas étudié de près votre algorithme, mais la première inspection, il semble probable que vous pouvez réarranger pour éviter d'avoir tout en mémoire à la fois.