【问题标题】:What is the fastest way to read files using c++使用c ++读取文件的最快方法是什么
【发布时间】:2013-05-08 09:44:01
【问题描述】:

读取文件意味着我将读取我硬盘上的每个文档(doc、docx、xls、xml、txt...)。

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

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

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

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

我应该使用什么功能?

【问题讨论】:

标签: c++ visual-c++ file-io


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      没有读取 I/O 的“最快”方法。你不能比fread 或同等速度更快。使用线程对您没有帮助,因为硬盘 I/O 无论如何都会成为主要瓶颈。

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

      【讨论】:

      • 这与我的措施不符(在 Linux 上完成)。你绝对可以击败fread。而且即使硬盘 IO 会成为主要瓶颈,分析他提到的一些格式也需要一些 CPU,所以使用线程会有一些收益。
      • 它会让他的程序快两倍吗?或者他会优化它以使运行速度提高 5% 吗?在我看来,他(错误地)认为他可以通过使用深奥的功能来显着加快他的程序,而事实上,读取硬盘上的所有文件无法优化超过fread
      • 这取决于fread 的实现,但一般来说,50% 或更多的加速并不罕见。
      • 这是否依赖于懒惰阅读?在他的用例中,如果我理解正确,他无论如何都会解析整个文件内容,搜索单词。我认为如果您仍然要阅读全部内容,内存映射不会更快。
      • 我不确定你所说的懒惰阅读是什么意思,但是......我承认结果让我自己有些吃惊。在大多数 Unix 下,当您打开文件时,只要您不查找,系统就会预读,因此您应该获得一些隐式并行化(以缓冲区之间的额外副本为代价)。当一个文件被映射时,我认为在出现页面错误之前不会进行读取,这会使有问题的线程停止(但我没有查看任何最近的 Unix 资源来确定)。然而,措施就是措施,使用mmap 明显快于readfreadstd::ifstream
      猜你喜欢
      • 2021-12-08
      • 2015-05-29
      • 2013-10-24
      • 2011-12-23
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      相关资源
      最近更新 更多