c++ - 优化文件打开和读取

标签 c++ optimization file-io

我有一个在 Windows 上运行的 C++ 应用程序,它每 15 分钟唤醒一次以打开和读取目​​录中的文件。每次运行时目录都会更改。

  • 打开由 ifstream.open(file_name, std::ios::binary) 执行
  • 读取由 streambuf ios::rdbuf()* 执行*
  • 每 15 分钟的文件总数约为 50,000
  • 文件以 20 个为一组打开和读取
  • 每个文件的大小在 50 KB 左右

对于每次运行;此操作(打开和读取)在磁盘主轴速度为 6000 RPM 的双核机器上大约需要 18-23 分钟。我捕获了内存页面错误/秒,它们在 8000 – 10000 的范围内。

有没有办法减少页面错误并优化文件打开和读取操作?

高瑟姆

最佳答案

如果可以避免,请不要使用 STL。它处理非常困难的国际化和翻译/转换问题,这使得它变慢了。

通常最快的读取文件的方法是对其进行内存映射(在 Windows 中也是如此,CreateFileMapping as starting point。如果可能的话,使用总大小为 50'000*50K 的单个文件并直接索引该文件写作/阅读时。 如果数据完全是结构化的,您还应该考虑使用数据库(甚至是 SQLite)。这个数据量很小,应该一直保存在内存中。您也可以尝试使用 ramdisk 来完全避免进入磁盘(这会在硬件/电力故障的情况下对您的错误恢复造成负担)。

关于c++ - 优化文件打开和读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1108156/

相关文章:

c++ - VS 2003 在后期构建期间无法注册 regsvr32。命令提示符没有问题

c++ - 为模板中的元组创建递归函数

C++ vector 指向指针的指针

c - 你知道哪些避免条件分支的技巧?

javascript - Nodejs可以处理的负载是多少

math - 计算矩阵的 k 次幂的迹

java - FileInputStream 是如何找到文件的?

c++ - 如何检查 C++ 编译时是否存在运算符的特定重载?

Python/Numpy - 将多个一维数组写入整齐列中的文件

java - 使用字符串标记器和扫描仪打印文件输入的学生平均值