读取文件意味着我将读取硬盘上的每个文档(doc,docx,xls,xml,txt等)。
我的大多数文件应该会在10KB〜1MB左右。
我会阅读文件并过滤文本,以查找特定单词。
因此,我猜想我应该有一个线程池和一个线程用于读取文件,其他线程用于过滤。
我听说有MMF
,CreateFile
/ReadFile
或I/O完成端口来读取每个文件。
我应该使用哪个函数?
读取文件意味着我将读取硬盘上的每个文档(doc,docx,xls,xml,txt等)。
我的大多数文件应该会在10KB〜1MB左右。
我会阅读文件并过滤文本,以查找特定单词。
因此,我猜想我应该有一个线程池和一个线程用于读取文件,其他线程用于过滤。
我听说有MMF
,CreateFile
/ReadFile
或I/O完成端口来读取每个文件。
我应该使用哪个函数?
如果你想要纯IO速度,你可以尝试使用CreateFileMapping
和MapViewOfFile
。我没有在Windows下测量过这个,但是在Linux下使用类似的技术可以显著提高速度。
没有最快的I/O读取方法。你无法比使用fread
或等效方法更快。使用线程也不会有帮助,因为硬盘I/O仍然是主要瓶颈。
当批量读取硬盘中的所有文件时,速度最终取决于硬盘的速度。很可能95%的时间都花在等待I/O上,所以多线程最多只能将速度提高5-6%,但不会使程序运行两倍快。
fread
。即使硬盘IO将是主要瓶颈,分析他提到的某些格式也需要一些CPU,因此使用线程仍然会有所收益。 - James Kanzefread
的优化。 - sashoalmfread
的实现,但通常情况下,加速50%或更多并不罕见。 - James Kanzemmap
比使用read
、fread
或std::ifstream
快得多。 - James Kanze