2011-09-30 81 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