【问题标题】:Looking for an efficient way to check for file existence on Windows with files on a SAN寻找一种有效的方法来检查 Windows 上的文件是否存在于 SAN 上的文件
【发布时间】:2012-04-04 13:29:16
【问题描述】:

我有大量文件位于 Windows 2003 服务器上的一系列目录中。每个目录中有超过一百万个文件。 Windows 服务器使用 iSCSI 连接到 Equalogics SAN。

我有一个应用程序需要确定一组文件是否存在 - 该应用程序需要检查每个目录是否存在多达一百万个文件。

我尝试了多种技术/脚本语言,包括 perl、vbscript、dos 批处理文件,但每秒无法获得超过 250 个文件检查。检查 800,000 个文件需要将近 50 分钟。我尝试对 perl 程序进行多线程处理以一次检查多个文件,但这没有帮助。

我还尝试使用 dir、ls、find(通过 cygwin)列出目录中的所有文件,但它需要很长时间才能开始输出任何文件名。无论如何,这不是一个好方法,因为文件比我实际需要检查的要多。

有没有办法强制 Windows 对目录进行“预读”,并将文件放入缓存中?

有没有更好的方法来解决这个问题的发现?

【问题讨论】:

    标签: windows file filesystems cygwin


    【解决方案1】:

    出于您指定的原因,我可能会避免使用任何解释性语言,例如 VBScript 等 - 只是在性能成为问题的情况下无法正常工作。

    现在,作为我对我的建议的正式警告,我假设在预期的时间内,这样的应用程序将运行该组propsective文件(搜索目标)保持相对稳定,从而存在误报的风险由于在扫描应用程序启动后发生的文件集更改而从应用程序检查是最小的。

    这并不优雅,但我至少建议探索一个 Win32(不是 .NET)控制台类型的应用程序,该应用程序递归地将目录树搜索到内存映射文件中,然后在该文件中搜索您需要的模式。这将磁盘访问限制为只需要累积结果所需的努力,然后将搜索放在可能(更快)的内存支持文件上。现在,我可能低估了您的文件集内容的大小和/或复杂性,但这就是我将提供的起点。

    我建议使用 Win32 应用而不是 .NET 应用,以避免框架运行时的开销,但适用于非托管应用的明显警告。

    希望这对您有所帮助,或者至少为您稍微搅动一下锅。祝你好运。

    【讨论】:

      【解决方案2】:

      当您单独检查每个文件时,您会受到请求和响应延迟的限制。除非您使用异步请求并同时运行许多请求,否则您能否找到一种方法来加快速度是值得怀疑的,但这种方法会给文件系统带来压力。

      虽然获取完整目录列表似乎有点过头,但它可能是最快的方法,除非您的搜索列表比完整目录小很多(比如小 100 倍)。

      【讨论】:

        【解决方案3】:

        每个单独的检查都要求操作系统通读目录,直到找到(或未能找到)您要求的文件。换句话说,每次检查平均读取目录一半以上的内容,因此读取完整目录一次几乎肯定会效率更高。

        但是,您不应该通过生成另一个程序来执行此操作。使用 FindFirstFile/FindNextFile 或 .NET 等效项。您可以在找到时根据列表检查每个文件 - 您可能希望先组织列表,将其放入 b-tree 或其他东西中。

        您可能想尝试使用 FileIdBothDirectoryInfo 选项而不是 FindFirstFile/FindNextFile 的 GetFileInformationByHandleEx 来查看哪个更快。

        【讨论】:

          猜你喜欢
          • 2011-11-03
          • 2021-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-23
          • 1970-01-01
          • 2014-12-19
          相关资源
          最近更新 更多