正在读取大文件(C++)中分隔开的小块

Reading small separated chunks of a large file (C++)

本文关键字:分隔 C++ 读取 文件      更新时间:2023-10-16

我正在读取一种专有的二进制数据文件格式。格式基本上是header,data,size_of_previous_data,header,data,size_of _previous_data,header,data,size _of_provious_data。。。报头的一部分包括下一个数据块的字节数以及紧接在数据之后列出的数据块的大小。标头为256字节,数据通常为~2MB,size_of_previous_data为32位整数。

这些文件通常很大~GB,我经常要在几十个文件中搜索我想要的数据。为了做到这一点,我在代码中做的第一件事是idex每个文件,即只读取标题并记录相关数据的位置(文件和字节号)。我的代码基本上使用fstream::read()准备好了头,检查数据大小,使用fstreat::seekg()跳过数据,然后读取size_of_previous_data,然后重复,直到到达文件末尾。

我的问题是这个索引非常慢。数据在我的Windows 10笔记本电脑上的内部7200 rpm硬盘上,任务管理器显示我的硬盘使用量已达到极限,但我只能获得大约1.5 MB/s的读取速度,响应时间通常>70毫秒。我使用std::fstream读取文件,使用fstream::get()读取标题,使用fsstream::seekg()移动到下一个标题。

我已经分析了我的代码,几乎所有的时间都花在fstream::read()代码中读取size_of_previous_data值。我认为,当我这样做的时候,紧接着的数据会被缓冲,所以我的fstream::read()获取下一个标头几乎不需要时间。

所以我想知道是否有一种方法可以优化这一点?在任何缓冲读取中,几乎我的整个缓冲区都可能被浪费(如果是8kB的缓冲区,则占97%)。有没有办法缩小这一点,它可能值得吗(也许底层操作系统缓冲区也是我无法改变的)?

假设磁盘查找大约需要10毫秒(每个程序员都应该知道的延迟数),文件是11 GB,由2 MB的块组成,理论上最短运行时间是5500*10毫秒=55秒。

如果你已经达到了这个数量级,那么加快速度的最有效方法可能是购买SSD。