繁体   English   中英

优化文件打开和读取

[英]Optimize file open and read

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

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

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

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

的Gowtham

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

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

第一; 感谢所有的答案。 这非常有帮助,为我们提供了许多探索途径。

我们删除了STL并使用了C(fopen&fread)。 对于上述数据的开放和读取操作,我们稍微改进了16-17分钟。

我们通过压缩这些文件确实解决了这个问题。 这将每个文件的大小从50K减少到8K。 开放和读取操作所花费的时间减少到4-5分钟。

谢谢。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM