用c++读文件最快的方法是什么?
visual What is the fastest way to read files using c++
读取文件意味着我将读取硬盘上的所有文档(doc, docx, xls, xml, txt,…)
我想我的大部分文件大约在10KB ~ 1MB。
我将阅读文件,并过滤文本,如果有任何特定的单词。
所以我的猜测是我应该有一个线程池和一个线程读取文件和其他线程做过滤。
我听说有MMF
, CreateFile
/ReadFile
或I/O完成端口来读取每个文件。
我应该使用什么函数?
在我的测试中,内存映射文件是将内容加载到内存中的最快方法,差距很小。
我执行的测试是在Linux上进行的,但由于将文件加载到内存映射区域的方法是每次将页面中的数据复制到操作系统拥有的内存中[内存映射文件支持内存完全由操作系统拥有和处理,因此操作系统有能力"锁定"该内存,等等]。这比将一小段文件读入内核缓冲区,然后将其内容复制到应用程序提供的缓冲区要快,因为它避免了一次复制。然而,对于大文件(或许多小文件),主要的限制因素仍然是"硬盘传输数据的速度有多快"——我的系统大约是60MB/s。你可以让它比系统产生的慢,但不能快。
对于纯IO速度,您可能想尝试CreateFileMapping
和MapViewOfFile
。我没有在Windows下测量过,但是在Linux下使用类似的技术可以导致显著的加速。
没有最快的读I/O方法。你不能得到任何比fread
或同等的更快。使用线程不会有任何帮助,因为硬盘I/O将是主要的瓶颈。
当批量读取硬盘中的所有文件时,您的速度最终将取决于硬盘的速度。很可能95%的时间都花在等待I/O上,所以多线程最多只能提高5-6%的速度,但不会使程序运行速度提高一倍。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 通过JNI传递数据数组的最快方法是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 在另一个类视图中添加最多2个图表的正确方法是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在C++中包含原型文件的正确方法是什么?
- 在 OpenCV C++ 中估计基本矩阵之前对相应点进行归一化的正确方法是什么?
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 将一系列整数放入类的最佳方法是什么?
- 从长整整转换为uint64_t的推荐方法是什么?
- 将此布尔值传递给此函数的最有效方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?