如何避免状态D中的程序

时间:2016-08-02 08:44:12

标签: linux file-io fortran hard-drive

我写了一个正在读/写数据的程序(打开一个infile和一个outfile,读取infile的一部分,然后进程,然后写入outfile,然后重复该循环),I / O值大约为200M / s in总。但是,大多数运行时,它们处于状态D,这意味着等待I / O(如图所示)1。我在我的系统中使用dd检查写入速度,大约是1.8G / s。

enter image description here

我的节目效率低下吗? 或者我的硬盘有问题吗? 我该如何处理?

1 个答案:

答案 0 :(得分:0)

如果使用ifort,则必须明确使用缓冲I / O.在-assume buffered_io语句中编译或设置buffered='yes'时标记为open

如果您使用gfortran这是默认设置,那么必然存在其他一些问题。

修改

我可以补充一点,这取决于你如何读写数据,大部分时间都可以用于解析它,即解码ascii字符123等,并将基数从10改为2,直到它是机器可读数据;然后在写作时反其道而行之。如果你构造这样的代码就是这种情况:

real :: vector1(10)

do
  read(5,*) vector1 !line has 10 values
  write(6,*) vector1
enddo

如果您改为执行以下操作,则会更快:

character(1000) :: line1 ! use enough characters so the whole line fits

do
  read(5,'(A)') line1 
  write(6,'(A)') line1
enddo

现在你只是通过程序抽取ascii,甚至不知道它的数字还是“ääåö(=)& /&%/(¤%/& Rhgksbks --- 31”。我认为这些修改你应该达到你的磁盘速度的最大值。

另请注意,大多数驱动器中都有写入缓存,这比磁盘读/写速度快,这意味着您可能首先受到读取速度的限制,并且在填充写入缓存之后,将受到限制。写入速度,通常低于读取速度。