2

約 40960000 行を含む大きなデータ ファイルを Fortran に読み込もうとしています。後でそれを行列に変換して、6400 * 6400 にします。はるかに小さいデータ セットを使用してコードを試すと、正常に動作します。ただし、より大きなデータセットを使用すると、セグメンテーション違反があることがわかります。メモリ割り当ての問題だと思います。より多くのメモリを割り当てる方法や、この問題を修正する方法はありますか?

   program infectgrid
   implicit none

   integer ::  i,  individual, nedge,&
    tempinfect_tim_err, dumnum_infalpha0, dumnum_infalpha1, alpha0counter, &
    alpha1counter, obsrand,  minvalshift

    character (LEN = 50) :: parameterfilelabel,  parameterfile, networkfilelabel,        infectfilenamelabel, networkfile, infectfilename
             !allocatable to allow for reading in of individuals and time periods
   integer, dimension(:) , allocatable :: xcord, ycord, dummy3, recover_tim1, recover_tim2, &
     recover_tim3, recover_tim4, recover_tim5,  sampleadjshort, shortsamplecount, &
     cov1dum, covlog, covvect1uni

    character, dimension (:), allocatable :: rec
   integer, dimension (:, :) ,  allocatable :: link  
    real, dimension(:) , allocatable  :: alphavect

    call random_seed

 open(12, file = "filenamesinfection.txt", status = "old")

 read(12, *) parameterfile, networkfile, infectfilename
 close(12)

 open(12, file = parameterfile, status = "old")
 read(12, *)  individualname, alpha0name, alpha1name
 read(12, *) individual, alpha0, alpha1

  nedge = individual*individual

allocate(rec(1:nedge))
allocate(xcord(1:nedge))
allocate(ycord(1:nedge))
allocate(dummy3(1:nedge))
allocate(sampleadjshort(1:nedge))
allocate(shortsamplecount(1:nedge))
allocate(covlog(1:nedge))
allocate(cov1dum(1:nedge))


allocate(link(1:individual, 1:individual))


   link = 0
   covlog = 0

    print *, individual, alpha0, alpha1
    print *, link(individual, individual)

    print *, "test"
   open(10, file = networkfile, status = "old")
   print *, networkfile       
   print *, "test"
   do i = 1, nedge

   read ( 10, *) rec(i),  xcord(i), ycord(i), dummy3(i), cov1dum(i), sampleadjshort(i),      shortsamplecount(i)    

   if (dummy3(i) == 1)  then 

   link(xcord(i), ycord(i)) = 1
    end if

    if (xcord(i) == ycord(i)) then 
    covlog(i) = 1
    end if
    end do
    close(10)

    covvect1uni = pack(cov1dum, covlog == 1)

    print *, "xcord",  xcord(nedge), "ycord",  ycord(nedge)
    print *, link(individual, individual)
    print *, "test"

ファイルは最初と2番目の「テスト」を出力しますが、リンクステートメントも「xcord」で始まる行も出力せず、すぐにセグメンテーション違反、つまりセグメンテーション違反nohup ./swnetworkinfectrecoveralpha05covgeo2.outを表示します

コンパイラ オプションに関しては、利用可能なもののほとんどを使用していると思います。

4

0 に答える 0