【问题标题】:GetFiles/GetDirectories and EnumerateDirectories/EnumerateFiles Performance penalty on UNC/virtual directoryGetFiles/GetDirectories 和 EnumerateDirectories/EnumerateFiles UNC/虚拟目录的性能损失
【发布时间】:2012-03-13 09:36:39
【问题描述】:

我有一个映射到网络驱动器号 W 的文件服务器。它有 732 个主文件夹和子文件夹以及很多文件。我已将一个虚拟目录映射到此驱动器并将其命名为“文档”。

现在我想检查只找到包含“final”的文件夹需要多少时间。我创建了一个控制台应用程序而不是一个网络应用程序,并编写了下面的代码,这给了我非常慢的结果,这是不希望的。请在下面找到代码

DateTime startdatetime = DateTime.Now;
var dirs = from dir in
Directory.EnumerateDirectories("W:\\", "*Final*", SearchOption.AllDirectories)
select dir;
foreach (var dir in dirs)
{
    Console.WriteLine(dir);
}
DateTime EndDate = DateTime.Now;
TimeSpan t = EndDate - startdatetime;
Console.WriteLine(t.Minutes);
Console.ReadLine();

这在第一次运行 5 分钟和第二次运行 6 分钟内只给了我文件夹而不是文件名。 我以前只获取文件夹的旧代码是

DateTime startdatetime = DateTime.Now;
string[] dirs = 
    Directory.GetDirectories("W:\\", "*Final*", SearchOption.AllDirectories);
foreach (var dir in dirs)
{
    Console.WriteLine(dir);
}
DateTime EndDate = DateTime.Now;
TimeSpan t = EndDate - startdatetime;
Console.WriteLine(t.Minutes);
Console.ReadLine();

上面的代码在 6-7 分钟内给了我文件夹列表。 以上代码组合文件和文件夹在 12 分钟内给出了结果。这在网络上会造成巨大的性能损失。

知道如何减少这个罚款上限吗?我被困在这里了。

【问题讨论】:

  • 有多少个结果?删除Console.WriteLine(dir);需要多长时间?
  • 驱动器多久更换一次?为什么不接受第一个惩罚,然后在该驱动器上创建一个FileSystemWatcher,这样您就不必不断研究所有内容?
  • 有多少个结果?大约 10 个仅用于文件夹。如果删除 Console.WriteLine(dir); 需要多长时间?对于 Directory.etDirectories 相同的 6 分钟,对于 Enumerable 一个 0(因为 enumerable 仅在访问时有效)驱动器多久更换一次?几乎每天。我会看看 FileSystemWatcher 我的目标是什么?我的目标是提供一个搜索文本框,用户输入任何名称,然后我搜索文件夹和文件并将它们列在izwebfilemanager.com
  • 您应该创建一个服务来将数据转储到数据库中。

标签: c# asp.net performance directory


【解决方案1】:

我觉得迭代整个目录和文件非常昂贵。试着找出你为什么需要它。为什么不获取一个目录并在其中搜索文件。我的意思是尝试与您的技术团队和企业主进行一些分析,以便每个人都切合实际。

我能想到的唯一一件事是对每个循环使用 Parallel 而不是普通循环,这样您就可以利用 CPU。但它会降低成本,但不会大幅降低。

【讨论】:

  • 并行循环?我以前没听说过...嗯,是不是我使用映射网络驱动器这就是为什么这很慢?
  • 请阅读msdn.microsoft.com/en-us/library/dd460720.aspx。它将为您提供有关 ||rl foreach 的更多信息。甚至您也会得到原始问题的答案。
  • 我尝试了并行,但没有白费。表现是一样的。我认为网络驱动器的延迟是不可能覆盖的。
  • 尝试先与您的业务人员交谈,了解他们为什么要进行这种昂贵的操作。读取地图网络驱动器上的目录非常昂贵,在这里您尝试读取目录+文件。可能您也会向您的企业寻求一些建议。
  • Shailesh 感谢您的回复。我认为只是告诉他们这是不可能的。我希望他们能理解。
【解决方案2】:

我相信他们的要求一点也不奇怪,他们只是想搜索他们的资产。您可以拥有一个小型数据库,同时它与您的文档文件夹及其文件路径同步,并且您的查询结果可能在表上而不是在 IO 文件上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多