2011-09-30 82 views
3

我想打開10,000個文件,文件名從abc25000開始,直到abc35000,並將一些信息複製到每個文件中。我寫的代碼如下:在Fortran 90中打開多個文件

PROGRAM puppy 
IMPLICIT NONE 

integer :: i 
CHARACTER(len=3) :: n1 
CHARACTER(len=5) :: cnum 
CHARACTER(len=8) :: n2 

loop1: do i = 25000 ,35000 !in one frame 

    n1='abc' 
    write(cnum,'(i5)') i 
    n2=n1//cnum 
    print*, n2 
    open(unit=i ,file=n2) 

enddo loop1 

此代碼應該生成abc24000開始直到abc35000文件,但它停止約一半說

At line 17 of file test-openFile.f90 (unit = 26021, file = '')

Fortran runtime error: Too many open files

怎麼辦我需要做的是修復上面的代碼?

回答

3

您需要一次處理一個文件(或者不超過操作系統強加的小組)。

 
for each file: 
    open file 
    write 
    close file 
+0

感謝您的這個想法。它現在有效。 – Vijay

3

操作系統往往對資源有限制。例如,通常在Linux上,每個進程默認有1024個文件描述符的限制。您收到的錯誤消息只是Fortran運行時庫向上傳遞的信息,由於操作系統錯誤,無法打開另一個文件。

4

此限制由您的操作系統設置。如果您使用的是Unix/Linux版本,則可以使用ulimit -n從命令行檢查限制,然後使用ulimit -n 16384將其提高。您需要設置一個大於10000的限制,以允許shell將打開的所有其他文件。您可能還需要管理員權限才能執行此操作。

我經常碰到限制到2048來運行Fortran程序,但從來沒有高達10000.但是,我回應其他答案,如果可能的話,最好重新組織您的程序關閉每個文件,然後再打開下一個。

+0

@Rook經常是誇大其詞。它通常用於將衛星數據從每個圖像的一個文件轉換爲每個像素時間序列的一個文件的一次性任務。這不是我爲之驕傲的代碼。 – Deditos

+0

儘可能多地思考;只有句子被放在一個我無法拒絕的方式:)) – Rook

+0

我使用的是linux ubuntu 10.10 64位和內存10GB。我有一點疑問。如果我將ulimit的值提高到16348,操作系統是否會有負面影響?另一個問題是爲什麼特別要數16348?我很想知道這一點。提前致謝。 – Vijay