【发布时间】:2015-03-06 20:34:00
【问题描述】:
我正在编写一个程序,它应该处理许多小文件,比如数千甚至数百万。 我一直在对 500k 文件测试该部分,第一步只是迭代一个目录,其中包含大约 45k 目录(包括子目录的子目录等)和 500k 小文件。遍历所有目录和文件,包括获取文件大小和计算总大小大约需要 6 秒。现在,如果我尝试在遍历时打开每个文件并立即关闭它,它看起来就像它永远不会停止。事实上,它需要的时间太长(几个小时......)。由于我在 Windows 上执行此操作,因此我尝试使用 CreateFileW、_wfopen 和 _wopen 打开文件。我没有在文件上读取或写入任何内容,尽管在最终实现中我只需要读取。但是,我在任何尝试中都没有看到明显的改进。
我想知道是否有更有效的方法来使用任何可用函数打开文件,无论是 C、C++ 还是 Windows API,或者唯一更有效的方法是读取 MFT 并直接读取磁盘块,我想避免什么?
更新:我正在处理的应用程序正在使用版本控制进行备份快照。因此,它也有增量备份。 500k 文件的测试是在一个巨大的源代码存储库上完成的,以便进行版本控制,类似于 scm。因此,所有文件都不在一个目录中。还有大约 45k 个目录(如上所述)。
因此,压缩文件的建议解决方案没有帮助,因为备份完成后,所有文件都可以访问。因此,我认为这样做没有任何好处,甚至会产生一些性能成本。
【问题讨论】:
-
我在 SSD 上执行此操作。问题在于打开/关闭文件
-
显示您的代码。没有看到你的代码。完全有可能您的代码处于无限循环中,调用了错误的 API,或者可能运行良好。但是没有你的代码,每一个建议都只是一个猜想或假设。此外,500,000 个文件是很多文件,我希望这是一个非常耗时的操作。 你真正想做什么?
-
代码没问题。它不进入递归,并完成(尽管经过很长时间)。它使用 FindFirstFile/FindNextFile 来遍历文件/目录。我只是在做一个基准测试,结果发现每个文件打开/关闭大约需要 5 毫秒。这就是我正在努力改进的......
-
@wallyk:KB2539403 说“当单个文件夹包含大量文件(超过 50,000 个文件)时,枚举文件列表时可能会出现性能问题。......当应用程序枚举目录内容时对于大型文件夹,NTFS 和缓存管理器的任务是读取和处理大量元数据以执行枚举。”是的,这绝对是关于包含大量文件的单个文件夹。
标签: c++ windows performance ntfs directory-traversal