正在读取大文件(C++)中分隔开的小块
Reading small separated chunks of a large file (C++)
我正在读取一种专有的二进制数据文件格式。格式基本上是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。
- 如何将 txt 文件中的行分隔为组件C++
- 无法通过空白将文本文件行分隔为矢量
- 如何在C++中读取空格分隔的输入 当我们不知道输入的数量时
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 如何逐行读取文件,每行中的内容都用空格分隔并将其写入新文件中
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- 如何在 C++ 中将文件中的逗号分隔数字读取到数组中?
- "Warning: Comma within array index expression"但逗号分隔函数参数
- C++逗号分隔的输入数组代码过早退出
- 如何分隔字符串并将标记传递给方法
- 分隔整数 (C++) 的数字
- 野牛/yacc 解析器在不被空格分隔时跳过 grammer - "unexpected $end"
- 读取制表符分隔的文件时出现问题 C++
- 通过分隔符分隔包含 UTF-16 BE 文本的uint8_t数组
- 如何更新和删除文本文件中的特定逗号分隔值?C++
- 如何将逗号分隔的文件读取为 2D int 数组?
- 读取带有分隔C++的文件