读取文件意味着我将读取硬盘上的每个文档(doc、docx、xls、xml、txt、...)。
我想我的大部分文件大约是 10KB ~ 1MB。
如果有任何特定的单词,我会阅读文件并过滤文本。
所以我的猜测是我应该有线程池和 1 个线程来读取文件和其他线程进行过滤。
我听说有MMF
, CreateFile
/ReadFile
或 I/O 完成端口来读取每个文件。
我应该使用什么功能?
读取文件意味着我将读取硬盘上的每个文档(doc、docx、xls、xml、txt、...)。
我想我的大部分文件大约是 10KB ~ 1MB。
如果有任何特定的单词,我会阅读文件并过滤文本。
所以我的猜测是我应该有线程池和 1 个线程来读取文件和其他线程进行过滤。
我听说有MMF
, CreateFile
/ReadFile
或 I/O 完成端口来读取每个文件。
我应该使用什么功能?
在我的测试中,内存映射文件是将内容加载到内存中的最快方式,幅度很小。
我执行的测试是在 Linux 上进行的,但是由于将文件加载到内存映射区域的方法是一次将页面中的数据复制到操作系统拥有的内存中[内存映射文件支持内存是拥有和处理的完全由操作系统控制,因此操作系统有能力将内存“锁定”到位,等等]。这比将一个文件读入内核缓冲区然后将该内容复制到应用程序提供的缓冲区中要快,因为它避免了一次复制。然而,对于大文件(或许多小文件),主要的限制因素仍然是“硬盘传输数据的速度”——对于我的系统来说大约是 60MB/s。你可以让它比系统产生的速度慢,但不能更快。
对于纯 IO 速度,您可能想尝试CreateFileMapping
和
MapViewOfFile
. 我没有在 Windows 下测量过这一点,但在 Linux 下使用类似的技术可以显着提高速度。
没有读取 I/O 的“最快”方法。您无法获得比fread
或同等速度更快的速度。使用线程对你没有帮助,因为硬盘 I/O 无论如何都是主要的瓶颈。
当批量读取硬盘中的所有文件时,您的速度最终将取决于硬盘的速度。很可能 95% 的时间都花在等待 I/O 上,所以多线程最多可以将速度提高 5-6%,但不会让程序运行速度提高一倍。