[英]Optimize file open and read
我有一个在Windows上运行的C ++应用程序,它每15分钟唤醒一次,以打开和读取目录中的文件。 每次运行时目录都会更改。
每次运行; 在双核机器上,此操作(打开和读取)大约需要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通常很慢,您仍然可以将这些中间缓冲区概念与多线程一起使用,这意味着运行并行读取线程。
也许你可以使用像memoisation这样的东西,即如果文件没有改变(你可以保存它的最后更新时间),那么你可以从最后一次使用它,即保留内存中的东西。
我认为你不需要FS缓存。 也就是说,在O_DIRECT模式下打开文件会更好(它是linux,但我确定Windows有类似的东西)并在一个I / O中读取每个文件,即在文件大小的内存中创建缓冲区并读入它。 这应该会大大减少CPU和内存的使用。
上面提到的多线程也会有所帮助,但并不多。 我怀疑瓶颈是磁盘,它可以每秒执行有限数量的I / O操作(100可以估计)。 这就是为什么你需要减少I / O操作的数量,比如使用上面描述的(1),(2)或其他东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.