用C语言读取文件的最快方法

时间:2012-11-17 17:35:30

标签: c io

我想读取GB的大小的文件(比如说10 GB)。在C中读取此类文件的最快方法是什么。我正在尝试执行tail,但我认为I / O可能是一个瓶颈。欢迎任何建议。

3 个答案:

答案 0 :(得分:1)

首先:我还没有看到一台通用计算机,其中物理IO足够快,文件比任何使用的缓存都大得多,CPU绑定处理是瓶颈。也就是说,我还没有看到所有通用计算机存在。

因此,您必须在CPU周期优化与其他因素(如可移植性,可维护性和可读性)之间取得平衡。我怀疑大多数用例,包括你给出的用例,都会指向简单地使用运行时库函数,信任,那些作者很清楚,他们正在做什么。

答案 1 :(得分:0)

您需要使用低级read系统调用来处理大文件,而不是更通用但更高开销fread。 (可以将stdio.h用于需要发出的相对少量的输出。)

您需要使用lseek跳过大部分文件,然后以块的形式向后扫描以查找行边界。

我会避免mmap这个应用程序;它可能会在内核中触发无用的I / O启发式,并且会增加一堆你不需要的可移植性问题。

如果这还不足以帮助您前进,请将您遇到困难的特定地点发布为新问题。

答案 2 :(得分:0)

正如其他人所说,所有环境都没有答案。你能做的最好的事情就是确定许多替代方案。

但是有一些事情可能会解释你得到的结果:

  1. 重叠计算和读取操作:现代机器具有直接内存访问(DMA)硬件和总线体系结构,使您可以在处理先前读取的缓冲区时将数据从磁盘流式传输到一个或多个缓冲区中。我们的想法是运行尽可能多的并行流,以保持所有设备接口和总线满负荷运行,或者CPU通过处理(而不是无用的复制,如下所述)或 - 在完美的世界中 - 两者兼而有之。例如,请查看Windows Overlapped IO

  2. 缓冲:磁盘I / O硬件和驱动程序,文件系统,内核/用户空间边界,语言I / O API以及您自己的应用程序代码都是可以缓冲数据的地方。在一个实例中,当使用标准C库进行文本I / O时,我能够在PC中识别4级缓冲/缓存。这使得每个字节至少被复制4次是不可避免的。道德是当你知道一个事实,即你以连续的顺序访问一个巨大的流,原始形式(例如没有用\ r \ n取代\ n),你的应用程序就是机器应该做的全部当它运行时,那些缓冲层变得大多无用。使用较低级别的界面可以消除的越多,您就越快。 Low Level Windows IO API至少消除了所有用户空间的缓冲和复制。

  3. 磁盘通道性能和并行性:如果文件存储在多个磁盘上,例如使用RAID,并且接口具有单独的DMA通道,则操作系统和/或代码可以获得并行硬件的好处。同样地,因为你得到你付出的代价,并不是所有的磁盘接口都是平等的。这是一个很深刻的主题,但通常,服务器针对磁盘并行性和高吞吐量进行了优化。处理非常大的文件的任何应用程序在服务器硬件上的运行速度可能比在普通PC上运行得快,并且将有更多机会利用异步/重叠IO。