我有一个Fortran程序,它一次写出大量的ASCII数据,一行一行,并且系统管理员(以及来自我的运行的证据)存在一些担忧,这会对系统性能产生负面影响。对于较少的大写,I / O通常比许多小写更好。因此,我希望通过在不改变输出文件格式的情况下写出更大的数据块来使程序最小化IOPS数量(这是一组包含大量相关软件的软件,具体取决于假定的文件格式) 。我曾想过像这样转一圈:
nwrite=100000000 !total number of lines to write
do cnt=1,nwrite
write(11,'(i22,3x,f16.14)')cnt,numar(cnt)
enddo
进入这样的循环:
nwrite=100000000
nblock=10000 !number of lines to write in each block
do cnt=1,nwrite/nblock
write(11,'(i22,3x,f16.14)')(nblock*(cnt-1)+j,numar(nblock*(cnt-1)+j),j=1,nblock)
enddo
会做到这一点。但我做了上面的两个小脚本,并没有显示运行时间的任何真正差异。在实际代码中进行更改是一个相当重要的时间承诺,所以在进行方法之前我还是要相当肯定。我还没有完全将循环展开到单个写命令中,因为这可能不适合我当前的问题,尽管这样做的方法也是受欢迎的。
任何人都可以确认上面的代码是否会减少写入命令的实际数量或者其他什么可能实现我正在寻找的东西?提前致谢。
答案 0 :(得分:0)
基于来自其他用户的输入并阅读更多内容,Fortran将对此的控制留给了编译器,因此它依赖于编译器。缓冲写入是Portland Group Fortran编译器的默认行为,对于GFortran来说它看起来是相同的。英特尔默认不缓冲文件。对于英特尔编译器,添加选项-assume buffered_io
将使文件I / O默认缓冲。