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 
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top