簡體   English   中英

數值Fortran中的最佳I / O實踐

[英]Optimal I/O practice in numerical Fortran

我有一些Fortran迭代代碼,每個集成步驟都會產生一些輸出。 在速度/准確性方面將這些步驟保存到磁盤的最佳實踐是什么?

我當前的方法包括聲明一個較大的數組,在每個集成步驟中,將輸出保存到數組的一行中,然后最終將整個數組的裁剪版本保存到文件中。 偽示例如下所示。

program IO_example

integer, parameter :: dp = selected_real_kind(33,4931) 

integer(kind=dp) :: nrows = 1e6, ncols = 6

real(kind=dp), dimension(nrows,ncols) :: BigDataArray
real(kind=dp), dimension(ncols) :: RowVector
real(kind=dp), dimension(:,:), allocatable :: SmallDataArray

integer(kind=dp) :: i !for iterating


i = 1
do while (condition)

!Update RowVector

BigDataArray(i,:) = RowVector
i = i+1

enddo


!First reallocate to create a smaller array
allocate(SmallDataArray(i,ncols))
SmallDataArray = BigDataArray(1:i, :)

!Now save
open(unit=10,file=BinaryData,status='replace',form='unformatted')
write(10) SmallDataArray
close(10)

end program IO_example

現在這可以正常工作,但是我的問題是這是執行此操作的最佳方法,還是某些其他方法更受歡迎? 最好的情況是,我特別指的是速度(寫數組和寫文件會減慢代碼多少速度),盡管准確性問題也很重要(我知道通過以二進制格式格式化可以避免這些問題。請參見StackOverflow答案 )。

我可以預見的一些潛在問題是SmallDataArray大於RAM(尤其是四精度),因此無法寫入磁盤。 此外,迭代次數可能會超過nrows (在這種情況下,我想一個人只能增加nrows ,但是這會在什么時候開始影響性能?)

在此先感謝您的幫助。

這可能是擴展的注釋,利用了一些格式,並且接近於觀點,但是有一兩個問題適合度量,您可能需要自己進行測試。

我不確定BigDataArray在您的代碼中扮BigDataArray ,因為在計算完成后,似乎並不需要內存中的所有數據。 您可能會完全刪除它,然后將結果累積到SmallDataArray 如果BigDataArray10^6行,則可以為SmallDataArray 10^5行,並將其填滿10次。 或者,如果您一開始不確定要分配多少行給Big ,那么就不行,只需將Small設置為10^5並填滿必要的次數,在計算收斂時退出。

(並且不要掛在我選擇的數字上, Small的最佳尺寸是您可能應該嘗試的東西。)

一旦代碼填滿Small將其寫入文件,請返回第1行並繼續。

如果您采用這種方法,將至少消除幾個潛在的性能問題; Small的重復分配(無論如何都不確定),以及從BigSmall復制一堆行時的數據移動(就計算性能而言,這不會給您帶來任何好處,並且不需要將數據寫入文件中) )。

如您所知,將數據寫入文件時(計算速度非常慢)的規則是一次性寫入大容量,但是很難指出,在沒有進行一些測量和測試的情況下該容量應達到多少。進行測試。

通過完全刪除Big ,可以在代碼運行時減輕內存負擔。 而且,如果在計算結束時確實需要所有Big ,則可以隨時將其讀回(當然要有可用的內存)。

最后,首先讓我進行報復:如果您對這個“答案”的回答類似於“ 哦”,那並不能回答我的真正問題,只能回答我提出的簡化問題,但我還要考慮所有其他問題您是否也想看看這些...然后您可以認為我對此的回答是(a)無法打印,(b)歸結為是,我會介意

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM