用c++读文件最快的方法是什么?

visual What is the fastest way to read files using c++

本文关键字:方法 是什么 c++ 文件      更新时间:2023-10-16

读取文件意味着我将读取硬盘上的所有文档(doc, docx, xls, xml, txt,…)

我想我的大部分文件大约在10KB ~ 1MB。

我将阅读文件,并过滤文本,如果有任何特定的单词。

所以我的猜测是我应该有一个线程池和一个线程读取文件和其他线程做过滤。

我听说有MMF, CreateFile/ReadFile或I/O完成端口来读取每个文件。

我应该使用什么函数?

在我的测试中,内存映射文件是将内容加载到内存中的最快方法,差距很小。

我执行的测试是在Linux上进行的,但由于将文件加载到内存映射区域的方法是每次将页面中的数据复制到操作系统拥有的内存中[内存映射文件支持内存完全由操作系统拥有和处理,因此操作系统有能力"锁定"该内存,等等]。这比将一小段文件读入内核缓冲区,然后将其内容复制到应用程序提供的缓冲区要快,因为它避免了一次复制。然而,对于大文件(或许多小文件),主要的限制因素仍然是"硬盘传输数据的速度有多快"——我的系统大约是60MB/s。你可以让它比系统产生的慢,但不能快。

对于纯IO速度,您可能想尝试CreateFileMappingMapViewOfFile。我没有在Windows下测量过,但是在Linux下使用类似的技术可以导致显著的加速。

没有最快的读I/O方法。你不能得到任何比fread或同等的更快。使用线程不会有任何帮助,因为硬盘I/O将是主要的瓶颈。

当批量读取硬盘中的所有文件时,您的速度最终将取决于硬盘的速度。很可能95%的时间都花在等待I/O上,所以多线程最多只能提高5-6%的速度,但不会使程序运行速度提高一倍。