SearchAllSubDirectories在负载下效率低下

时间:2015-10-16 15:19:22

标签: vb.net performance visual-studio file-io

为了详细解决这个问题,我需要从不同目录中获取数百个文件“DKIM.txt”,可能需要数千次。

该文件将始终显示在以下文件夹中:

C:\ CONX \ Users \用户杰森\ 222 \ DKIM.txt

C:\ CONX \ Users \用户唐纳德\ 12 \ DKIM.txt

C:\ CONX \ Users \用户由里\ 1251 \ DKIM.txt

文件夹深度将从不更改,用户名和标识符(例如Jason和222)将始终更改。

我目前正在使用的代码如下:

For Each UserDirectory As String In My.Computer.FileSystem.GetFiles("C:\CONX\Users", FileIO.SearchOption.SearchAllSubDirectories, "DKIM.txt")
     Console.WriteLine(UserDirectory)
Next

上述问题是我们人口密集的机器运行缓慢。它们的负载有时可以是80-90%的CPU,并且只需循环遍历所有子目录以搜索我们知道将始终存在的一个文件,效率低且速度慢。

所以我的问题是,我如何只是通配符目录用户名和标识符。

示例:返回所有匹配的目录:C:\ CONX \ Users \ * \ * \ DKIM.txt其中*是我们的通配符。

谢谢。

3 个答案:

答案 0 :(得分:0)

根据子目录的数量,进行自定义搜索可能会更快。您可以使用GetDirectoryGetFiles自行搜索。

循环C:\ CONX \ Users
下的所有目录 循环所有子目录
检查该子目录是否包含该文件。

这也取决于每个用户名下是否有多个目录。我还建议缓存结果。如果你只需要运行一次,那么它的速度可能并不重要。

另外,Console.WriteLine非常慢。您可以在文件中写入,但您可能会看到一些改进。

答案 1 :(得分:0)

正如汉斯·帕斯特(Hans Passant)如此雄辩地指出这些缺陷,我将继续提出我认为可行的建议。在这里。

使用程序监视\ Users文件夹以查找任何文件(创建/删除)并添加触发器以运行批处理脚本以更新维护所有用户和标识符的文本文件。如果您愿意,可以编写自己的窗口进程(守护进程),也可以使用Watch 4 Folder等现成的软件。这是一个指南,描述了它的可用性http://www.guidingtech.com/9861/automate-folder-actions-windows-watch-4-folder/

现在您将只搜索新的文本文件(主列表),而不是遍历整个目录和子目录结构。如果您可以将用户/标识符的主列表存储在数据库中并使用批处理脚本或powershell来更新数据库,那将更好。

祝你好运。

答案 2 :(得分:0)

解决方案:使用预定义的深度限制进行搜索,同时还匹配文件名。这将消除浪费的CPU周期,以递归方式搜索我们在每个目录中存在的文件。

csrfSecret

来源:http://www.coderslexicon.com/playing-with-recursive-directory-diving-in-vb-net/

例如。 GetFiles(" DKIM.txt"," C:\ CONX \ Users",3,0)

使用FileIO.SearchOption.SearchAllSubDirectories将数百个大型目录的执行时间从几秒钟减少到不到半秒。

相关问题