我有一个在 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/