使用istream :: seekg太昂贵了吗?

时间:2014-01-18 05:09:02

标签: c++ large-files ifstream seek seekg

在c ++中,使用istream :: seekg操作有多贵?

编辑:我可以通过寻找文件和读取字节来逃脱多少?频率与偏移幅度有什么关系?

我有一个我正在解析的大文件(4GB),我想知道是否有必要尝试整合我的一些seekg调用。我认为文件位置差异的大小起着作用 - 就像你在内存中寻找超过页面一样,它会影响性能 - 但是小搜索并不重要。这是对的吗?

1 个答案:

答案 0 :(得分:6)

这个问题在很大程度上取决于您的操作系统和磁盘子系统。

显然,搜索本身基本上只需要零时间,因为它只是更新偏移量。实际上,读取会从磁盘中提取一些数据......

...但是有多少数据取决于很多事情。您的磁盘有一个缓存,可能有自己的块大小,可能会进行某种预读。您的RAID控制器(如果有)将拥有自己的缓存,可能具有自己的块大小和预读。

你的内核有一个页面缓存 - 基本上都是所有的空闲内存 - 它也可能会进行某种预读。在Linux上,这是可配置的,内核将根据您的访问模式的顺序来调整它,无论您是否已调用posix_fadvise等。

所有这些缓存意味着如果您访问某些数据,然后稍后访问附近的数据,则第二次访问可能实际上根本不会触及磁盘。

如果您可以选择编码以便顺序访问文件,那么肯定会比随机读取更快,尤其是小型随机读取。在单个机械磁盘上​​寻找需要10ms的时间,所以你可以在这里进行数学计算。 (虽然寻求固态驱动器的速度要快100倍。)

大读取通常比小读取更好......虽然处理数据一次只有几千字节,但如果允许处理保留在缓存中,则比较大的块更快。

简而言之,您需要提供有关系统和应用程序的更多详细信息以获得正确的答案,即使这样,最可能的答案是“基准测试”。