Хитрость для чтения данных с жесткого диска быстрее между успешными компиляциями

Я занимаюсь разработкой кода на скомпилированном языке (Fortran 95), который выполняет определенные вычисления в огромном каталоге галактик. Каждый раз, когда я внедряю некоторые изменения, я компилирую и запускаю код, и это занимает около 3 минут, просто читая файл ASCII с данными галактики с диска. Это пустая трата времени.

Если бы я запустил этот проект в IDL или Matlab, он был бы другим, потому что переменные, содержащие данные массива, сохранялись бы в памяти между различными компиляциями.

Тем не менее, я думаю, что можно было бы что-то сделать, чтобы ускорить это нервное чтение с диска, например, поместить файлы в поддельный раздел ОЗУ или что-то в этом роде.

1 ответ

Решение

Вместо того, чтобы вдаваться в подробности о RAM-дисках, я предлагаю вам перейти с ASCII-баз данных на двоичные. Вот очень упрощенный пример... Массив случайных чисел, сохраненный как 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!

Поэтому вместо того, чтобы думать о чем-то другом, сначала переключитесь на двоичный формат файла.

Другие вопросы по тегам