2011-08-21 68 views
1

我正在使用Windows ReadFile函數按順序讀取4GB文件,並使用FILE_FLAG_NO_BUFFERING。我使用的是64K的緩衝區,並且所有的工作都正確,但問題是我的數據在當前緩衝區結束和下一次讀取之間被切斷。例如,我有一個4字節的浮點數序列,當我到達最後一個浮點數時,只有三個字節在當前緩衝區中,下一個字節將進入下一個讀緩衝區。那我該如何處理呢?我應該跟蹤用於保留最後三個字節的字節數,然後在讀取下一個緩衝區後追加最後一個字節數?或者,也許將緩衝區複製到另一個緩衝區並在那裏跟蹤浮游物?但是這並不能擊敗Windows緩存不讀取的優勢?謝謝你的幫助。ReadFile FILE_FLAG_NO_BUFFERING如何讀取兩個扇區之間的數據

回答

0

我認爲,在你處於邊界的特殊情況下,你應該將前一個塊的位和下一個塊的位並行複製到一個小的臨時空間中,然後從那裏讀取它們完好無損。當你不在邊界時,你不需要使用這個臨時空間。

0

無論如何,你必須自己做這個會計,因爲無緩衝的讀取需要對齊。

但一個更好的問題是,爲什麼你認爲你需要這樣做?您是否嘗試過使用std::ifstream來讀取您的文件?現代處理器和緩存在隱藏(或實際上消除)您可能認爲緩衝I/O執行的額外副本方面有很長的路要走。

此外,如果您正在順序讀取,FILE_FLAG_NO_BUFFERING將禁止操作系統的預讀機器。這幾乎肯定會讓您遠遠超過繞過操作系統緩衝區所帶來的成本。

我懷疑你會發現,最簡單的代碼將執行最好的連續閱讀大文件。這幾乎是現代系統針對每個級別進行優化的原因...

+0

感謝您的回答。我一直在閱讀關於FILE_FLAG_NO_BUFFERING的文章,並且推薦閱讀大文件時,比如說1GB以上。在這種情況下,緩存管理器無法很好地處理緩存。事實上,我嘗試了ifstream和ReadFile與FILE_FLAG_SEQUENTIAL_SCAN,他們都慢了15%到20%,這意味着更多的時間來閱讀和處理我的文件。 – Daniel