繁体   English   中英

读取大文件的各个小块(C ++)

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

我正在读取专有的二进制数据文件格式。 格式基本上是标头,数据,size_of_previous_data,标头,数据,size_of_previous_data,标头,数据,size_of_previous_data,...。标头的一部分包括下一个数据块的字节数及其大小,紧随其后。数据。 标头为256字节,数据通常为〜2MB,size_of_previous_data为32位int。

这些文件通常很大〜GB,而且我经常不得不在数十个文件中搜索所需的数据。 为了做到这一点,我在代码中要做的第一件事是识别每个文件,即仅读入标头并记录相关数据的位置(文件和字节号)。 我的代码基本上使用fstream :: read()准备标头,检查数据大小,使用fstream :: seekg()跳过数据,然后读入size_of_previous_data,然后重复直到我到达文件末尾。

我的问题是此索引编制非常缓慢。 数据位于Windows 10笔记本电脑上的内部7200 rpm硬盘驱动器上,任务管理器显示我的硬盘驱动器使用已满,但是我得到的读取速度仅为1.5 MB / s,响应时间通常> 70 ms。 我正在使用std :: fstream读取文件,并使用fstream :: get()读取标题,并使用fstream :: seekg()移至下一个标题。

我已经分析了我的代码,几乎整个时间都花在fstream :: read()代码中,以读取size_of_previous_data值。 我想当我这样做时,缓冲后的数据就立即被保存了,所以我的fstream :: read()获取下一个标头几乎不需要时间。

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

假设磁盘搜索大约需要10毫秒( 每个程序员都应该知道的延迟数 ),则您的文件为11 GB,包括2 MB块,理论上的最小运行时间为5500 * 10 ms = 55秒。

如果您已经处于这个数量级,那么加快速度的最有效方法可能就是购买SSD。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM