Вместо того, чтобы подробно останавливаться на 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!
Поэтому вместо того, чтобы думать о чем-либо еще, сначала переключитесь на формат двоичного файла.
Я немного изменил заголовок, чтобы лучше подобрать ответ, который я выбрал. Этот ответ не соответствует моему первоначальному ответу 100% (нет подсказок о том, как сделать раздел в ОЗУ), но слишком полезно не присуждать ему зеленый тег. Я напишу еще один вопрос о каталоге RAM. – Mephisto
Вы сделали некоторые фактические измерения, или вы просто догадываетесь, что узким местом является дисковый ввод-вывод, а не, например, анализ формата данных ASCII? Предполагая, что у вас достаточно RAM для ramdisk, у вас, вероятно, также есть много доступного для дискового кеша, поэтому есть хорошие шансы, что вы все равно читаете в основном из памяти. Принятый ответ намекает на это. –
@ DanMašek Я игнорирую особенности того, что вы предлагаете, но я думаю, что это происходит в первый раз, когда я запускаю код после входа в систему, чем последовательные чтения. Кроме того, пока файл читает, команда TOP не показывает 100% -ную активность процессора, поэтому, вероятно, проблема связана с чтением жесткого диска. – Mephisto