我正在研究一個項目,我需要將一些現有數據寫入磁盤ascii。我有一些工作,但IO本身是非常昂貴的,我想進一步優化。優化Fortran ascii文件IO
數據基本上是實數的數組,但是某些列存儲需要重新編碼爲字符串的編碼字符串(不要問!)。這個問題的輸入和輸出超出了我的控制範圍,我正在接收這個真正的數組,並且需要將它寫爲ascii。
我知道一次寫入數組是正確的,因爲未格式化的寫入速度更快,但這不能正確處理字符串列。有任何想法嗎?
下面是一些示例代碼:
program test
implicit none
integer(kind=4), parameter :: nrows = 5000
integer(kind=4), parameter :: ncols = 400
integer, parameter :: real_kind = 8
integer(kind=4) :: i,j, handle
character(len=256) :: value_str
character(len=1) :: delimiter
real(kind=real_kind) :: data(nrows,ncols)
delimiter = " "
data(:,:) = 999.999
! Some examples of the "string columns"
data(:,10) = transfer(' foo ',data(1,1))
data(:,20) = transfer(' bar ',data(1,1))
handle=10
open(handle,file="out.txt",status="replace", access="stream")
do i=1,nrows
do j=1,ncols
! If this column contains encoded strings then recast
if((j==10).or.(j==20))then
write(handle) delimiter
value_str = transfer(data(i,j),value_str(1:real_kind))
write(handle) trim(value_str)
else
write(value_str,*) data(i,j)
write(handle) trim(value_str)
endif
enddo
write(handle) new_line('x')
enddo
close(handle)
end program test
gfortran test.F90 -o test.x
時間test.x
真實0m2.65s
用戶0平方米.24s
sys 0m0.04s
編輯:從原始test.F90代碼樣本中刪除「if(j/= 1)」以迴應評論。
什麼是「但這不正確地處理字符串列」。意思?數據格式的例子在哪裏? –
如果您運行上面提供的test.F90代碼並查看out.txt,則可以看到數據格式。您可以將字符串讀爲「foo」和「bar」,即可讀的字符串。 –