我正在使用Windows ReadFile函數按順序讀取4GB文件,並使用FILE_FLAG_NO_BUFFERING。我使用的是64K的緩衝區,並且所有的工作都正確,但問題是我的數據在當前緩衝區結束和下一次讀取之間被切斷。例如,我有一個4字節的浮點數序列,當我到達最後一個浮點數時,只有三個字節在當前緩衝區中,下一個字節將進入下一個讀緩衝區。那我該如何處理呢?我應該跟蹤用於保留最後三個字節的字節數,然後在讀取下一個緩衝區後追加最後一個字節數?或者,也許將緩衝區複製到另一個緩衝區並在那裏跟蹤浮游物?但是這並不能擊敗Windows緩存不讀取的優勢?謝謝你的幫助。ReadFile FILE_FLAG_NO_BUFFERING如何讀取兩個扇區之間的數據
1
A
回答
0
我認爲,在你處於邊界的特殊情況下,你應該將前一個塊的位和下一個塊的位並行複製到一個小的臨時空間中,然後從那裏讀取它們完好無損。當你不在邊界時,你不需要使用這個臨時空間。
0
無論如何,你必須自己做這個會計,因爲無緩衝的讀取需要對齊。
但一個更好的問題是,爲什麼你認爲你需要這樣做?您是否嘗試過使用std::ifstream
來讀取您的文件?現代處理器和緩存在隱藏(或實際上消除)您可能認爲緩衝I/O執行的額外副本方面有很長的路要走。
此外,如果您正在順序讀取,FILE_FLAG_NO_BUFFERING
將禁止操作系統的預讀機器。這幾乎肯定會讓您遠遠超過繞過操作系統緩衝區所帶來的成本。
我懷疑你會發現,最簡單的代碼將執行最好的連續閱讀大文件。這幾乎是現代系統針對每個級別進行優化的原因...
相關問題
- 1. 如何在文本之間讀取兩個html標記之間的數據
- 2. 如何在Windows中使用DeviceIoControl()讀取各個扇區/羣集?
- 3. readFile和readFileSync之間的區別
- 4. 如何讀取兩個空格之間的數字?
- 5. 如何找到兩個數據庫之間的區別?
- 6. 獲取兩個數據表之間的區別?
- 7. 閱讀單扇區
- 8. 讀取扇區的引導程序
- 9. 從OS光盤如何讀取普通的數據扇區(模式1)X
- 10. Writefile,壞扇區的讀取文件代碼錯誤
- 11. 從mifare classic中讀取特定扇區
- 12. 磁盤扇區讀取目標c
- 13. 在C#中讀取和寫入扇區#
- 14. 如何讀取PureScript(READFILE)的文件
- 15. 如何讀取使用的ReadFile上WINAPI
- 16. 如何在Mongo中的兩個日期之間獲取數據?
- 17. 如何在mysql中的兩個日期之間獲取數據?
- 18. 這兩個函數之間的區別
- 19. 兩個圓形扇區的交集
- 20. 如何獲取文件的扇區號
- 21. 如何找到兩個整數數組之間的區別?
- 22. 讀取硬盤扇區原始數據 - 爲什麼是十六進制?
- 23. 如何在兩個日期之間獲取數據?
- 24. 如何在兩個日期之間獲取數據?
- 25. Rails ActiveRecord - 如何在兩個日期之間取數據
- 26. 如何在Linux內核中使用bio請求讀取扇區
- 27. 如何匹配數據庫中兩個表之間的數據?
- 28. Assembly - 讀取虛擬磁盤的下一個扇區
- 29. ReadFile的COM整批
- 30. 兩個時間戳之間的區別
感謝您的回答。我一直在閱讀關於FILE_FLAG_NO_BUFFERING的文章,並且推薦閱讀大文件時,比如說1GB以上。在這種情況下,緩存管理器無法很好地處理緩存。事實上,我嘗試了ifstream和ReadFile與FILE_FLAG_SEQUENTIAL_SCAN,他們都慢了15%到20%,這意味着更多的時間來閱讀和處理我的文件。 – Daniel