我正在使用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. 阅读单扇区
- 4. 读取扇区的引导程序
- 5. 从OS光盘如何读取普通的数据扇区(模式1)X
- 6. 从mifare classic中读取特定扇区
- 7. 磁盘扇区读取目标c
- 8. 如何读取使用的ReadFile上WINAPI
- 9. 如何读取PureScript(READFILE)的文件
- 10. 如何找到两个整数数组之间的区别?
- 11. 从两个日期之间的数据库获取数据
- 12. Rails 3.如何获得两个数组之间的区别?
- 13. 如何在greenDao数据库中的两个日期之间获取数据
- 14. 如何从sqlite数据库获取两个日期之间的所有数据?
- 15. ReadFile的COM整批
- 16. Mysql获取两行之间的数据
- 17. 如何使用Android NDK读取和写入SD卡中的单个扇区
- 18. 如何绘制一个BufferedImage的扇区?
- 19. 什么是两个语句之间的区别... context.getImageData()。数据和
- 20. 两个SQL Server数据库快照之间的区别
- 21. 获取两个日期时间单元格之间的数据
- 22. 如何使用sql server获取两个时间戳之间的数据
- 23. 两个文件之间的两个时间戳之间的数据组合
- 24. 2个数据表之间的区别
- 25. 如何在两个数据库之间共享(使用)数据?
- 26. Android:获取两个时区之间的时间差(秒)
- 27. 如何在SAS中的两个日期之间提取/获取数据?
- 28. 在启动盘上读取一个扇区
- 29. FATFS:如何获取文件的第一个扇区的地址?
- 30. MySql秒之间的两个时间戳之间的区别?
感谢您的回答。我一直在阅读关于FILE_FLAG_NO_BUFFERING的文章,并且推荐阅读大文件时,比如说1GB以上。在这种情况下,缓存管理器无法很好地处理缓存。事实上,我尝试了ifstream和ReadFile与FILE_FLAG_SEQUENTIAL_SCAN,他们都慢了15%到20%,这意味着更多的时间来阅读和处理我的文件。 – Daniel