优化文件打开和读取

时间:2009-07-10 07:21:02

标签: c++ optimization file-io

我在Windows上运行了一个C ++应用程序,每15分钟就会启动一次打开&读取目录中的文件。每次运行时目录都会更改。

  • open由 ifstream.open(file_name,std :: ios :: binary)
  • 执行
  • 读取由 streambuf执行 ios :: rdbuf()*
  • 每15分钟的文件总数约为50,000
  • 文件已打开&分批阅读
  • 每个文件的大小约为50千字节

每次跑步;该操作(打开和读取)在双核机器上花费大约18-23分钟,盘主轴速度为6000RPM。我已经捕获了内存页面错误/秒,它们的范围是8000 - 10000。

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

的Gowtham

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

首先;感谢所有的答案。它非常有用,为我们提供了许多探索途径。

我们删除了STL并使用了C(fopen& fread)。这为我们提供了一个轻微的改进与Open&对上述数据进行读操作需要16-17分钟。

我们确实通过压缩这些文件来解决问题。这将每个文件的大小从50K减少到8K。 Open& amp;读操作减少到4-5分钟。

谢谢。

答案 2 :(得分:0)

根据MS PSDK文档,可以使用文件缓存。而且,恕我直言,而不是STL,具有适当标志的Windows原生CreatFile,ReadFile和CloseHandle可能会因为你提到的窗口而获得更好的性能。

但是,另一方面,根据你的帖子,你似乎只读过。因此,缓存可能不会显着提高性能。但是,由于CPU速度很快而磁盘i / o通常很慢,你仍然可以将这些中间缓冲区概念与多线程一起使用,这意味着运行并行读取线程。

答案 3 :(得分:0)

  1. 也许你可以使用memoisation这样的东西,即如果文件没有改变(你可以保存它的最后更新时间),那么你可以在上次使用它,即保留内存中的东西。

  2. 我认为你不需要FS缓存。即最好在O_DIRECT模式下打开文件(它是linux,但我确定Windows有类似的东西)并读取一个I / O中的每个文件,即在文件大小的内存中创建缓冲区并读入它。这应该会大大减少CPU和内存的使用。

  3. 上面提到的多线程也会有所帮助,但并不多。我怀疑瓶颈是磁盘,它可以每秒执行有限数量的I / O操作(100可以估计)。这就是为什么你需要减少I / O操作的数量,比如使用上面描述的(1),(2)或其他东西。