在过度编译之间更快地从硬盘驱动器读取数据

时间:2017-02-20 19:38:37

标签: arrays fortran mount ramdisk

我正在使用编译语言(Fortran 95)开发代码,该代码在巨大的星系目录上进行某些计算。每次我实现一些更改,我编译并运行代码,只需要用磁盘上的galaxy数据读取ASCII文件大约需要3分钟。这是浪费时间。

如果我在IDL或Matlab中启动这个项目,那么它会有所不同,因为包含数组数据的变量将保存在不同编译之间的内存中。

但是,我认为可以采取措施加速从磁盘上读取令人不安的内容,例如将文件放在虚假的RAM分区中等等。

1 个答案:

答案 0 :(得分:6)

我建议您从ASCII数据库切换到二进制数据库,而不是详细介绍RAM磁盘。这是一个非常简单的例子......一组随机数,存储为ASCII(ASCII.txt)和二进制日期(binary.bin):

program writeArr
  use,intrinsic :: ISO_Fortran_env, only: REAL64
  implicit none
  real(REAL64),allocatable :: tmp(:,:)
  integer :: uFile, i

  allocate( tmp(10000,10000) )

  ! Formatted read  
  open(unit=uFile, file='ASCII.txt',form='formatted', &
       status='replace',action='write')
  do i=1,size(tmp,1)
    write(uFile,*) tmp(:,i)
  enddo !i
  close(uFile)

  ! Unformatted read  
  open(unit=uFile, file='binary.bin',form='unformatted', &
       status='replace',action='write')
  write(uFile) tmp
  close(uFile)

end program

以下是尺寸方面的结果:

 :> ls -lah ASCII.txt binary.bin 
-rw-rw-r--. 1 elias elias 2.5G Feb 20 20:59 ASCII.txt
-rw-rw-r--. 1 elias elias 763M Feb 20 20:59 binary.bin

因此,就存储而言,您可以节省~3.35的因子。 现在来到有趣的部分:阅读它......

program readArr
  use,intrinsic :: ISO_Fortran_env, only: REAL64
  implicit none
  real(REAL64),allocatable :: tmp(:,:)
  integer :: uFile, i
  integer :: count_rate, iTime1, iTime2

  allocate( tmp(10000,10000) )

  ! Get the count rate
  call system_clock(count_rate=count_rate)

  ! Formatted write  
  open(unit=uFile, file='ASCII.txt',form='formatted', &
       status='old',action='read')

  call system_clock(iTime1)
  do i=1,size(tmp,1)
    read(uFile,*) tmp(:,i)
  enddo !i
  call system_clock(iTime2)
  close(uFile)
  print *,'ASCII  read ',real(iTime2-iTime1,REAL64)/real(count_rate,REAL64)

  ! Unformatted write  
  open(unit=uFile, file='binary.bin',form='unformatted', &
       status='old',action='read')
  call system_clock(iTime1)
  read(uFile) tmp
  call system_clock(iTime2)
  close(uFile)
  print *,'Binary read ',real(iTime2-iTime1,REAL64)/real(count_rate,REAL64)

end program

结果是

 ASCII  read    37.250999999999998     
 Binary read    1.5460000000000000   

因此,因子> 24!

因此,请不要考虑其他任何事情,请先切换为二进制文件格式。