0

Directory.GetFiles 方法尝试从 Win2008R2 VMServer 上的 UNC 文件夹共享(NTFS 磁盘)搜索 Word 文档时遇到了一个奇怪的问题。该共享在父文件夹中包含超过 10K 文件,在子目录中包含 75K 文件。

在 Win2003 Server 中一切正常。当迁移到 Win2008R2 服务器时,WinForms 应用程序会冻结此方法,并且需要将近 13 分钟才能从通过下载速度带宽为 1Mbps(不是吞吐量)的 VPN 网络连接到文件共享的客户端计算机上打开单个文件。

经过搜索和研究,我们发现 Windows Search 服务没有打开,服务已启动,共享已被索引。我们看到了性能改进,使用 GetFiles 方法打开文件所需的时间从 13 分钟降至 3 分钟。

但这并不一致。在带宽远低于 1MBPS(例如 0.5 MBPS)的白天时间,打开文档的时间跨度再次介于 8-12 分钟之间。

在这一点上,我们不确定是哪一个导致了问题?

不可能的解决方案:1)创建多个目录并组织文件。2)增加带宽。3) 使用直接文件路径而不是 Directory.GetFiles/EnumerateFiles

非常感谢任何帮助。谢谢!

4

1 回答 1

0

哦,是的,好东西。您会注意到,即使该服务已关闭,运行两次(彼此相隔很短的时间)第二次运行速度也会快得多。实际上,这里有一个适合你的,运行两次,让第一个运行一分钟。第二个将几乎立即赶上第一个,然后他们将在其余时间都在同一个位置。(如果我说的有道理)。

这是正在发生的事情,GetFiles() 和 GetDirectories() 确实使用索引服务。此外,如果您的索引服务已关闭,这仅意味着它不会自动获取有关文件的数据,但是当您访问文件(Windows 资源管理器/GetFiles)时,它会为它们编制索引,因此如果您使用设置的时间,它不必再次查询硬盘驱动器的目录。

就索引服务打开时它的运行速度越来越慢而言,这是因为 Windows 知道它无法跟踪计算机上的每个文件。因此,经过一定时间后,文件被认为是陈旧的,当您询问文件时,索引服务将执行 IO 调用以获取更新索引数据库的信息。

这个wiki谈论它,只是一点点。不是很彻底。

于 2013-10-17T16:41:35.767 回答