系统.网络上的IO性能问题

本文关键字:性能 问题 IO 网络 系统 | 更新日期: 2023-09-27 18:08:44

我在网络上迭代一个大目录(500 GB),我需要从根目录和子目录内迭代所有文件,这是我的示例代码

    static void WalkDirectoryTree(DirectoryInfo root, DbContext dbcontext)
    {
                FileInfo[] files = null;
                DirectoryInfo[] subDirs = null;
                try
                {
                    Console.WriteLine(DateTime.Now + " Listing files...");
                    files = root.GetFiles("*.*");
                    Console.WriteLine(DateTime.Now + " Files obtained.");
                }
                catch (UnauthorizedAccessException e)
                {
                }
                catch (System.IO.DirectoryNotFoundException e)
                {
                    Debug.Print(e.Message);
                }
                if (files != null)
                {
                    Console.WriteLine(DateTime.Now + " Iterating files...");
                    foreach (System.IO.FileInfo fi in files)
                    {
                        Console.WriteLine(DateTime.Now + " Indexing [" + fi.FullName + "]...");
                        doIndex(IndexData index = new IndexData();
                        index.attachementUID = fi.Name;
                        dbcontext.IndexDatas.Add(index);
                    }
                    Console.WriteLine(DateTime.Now + " File iteration completed.");
                    subDirs = root.GetDirectories();
                    foreach (System.IO.DirectoryInfo dirInfo in subDirs)
                    {
                        WalkDirectoryTree(dirInfo,dbcontext);
                    }
            }
  }

性能非常慢,我正在阅读文件名和文件路径,所以你们可以推荐一些东西,我可以用它来迭代所有的文件从网络路径,如何改进当前的代码,任何系统。IO改进和替代方案。

其次,我怎样才能知道我在文件系统中的位置。我迭代了一半,应用程序崩溃了,我怎么能从相同的位置再次开始迭代?

系统.网络上的IO性能问题

您应该使用DirectoryInfo.EnumerateFiles()而不是DirectoryInfo.GetFiles(),从MSDN:

EnumerateFiles和GetFiles方法的区别如下使用EnumerateFiles,您可以开始枚举名称集合在整个集合被返回之前;当你使用GetFiles时,你必须等待整个名称数组返回后才能这样做吗访问数组。因此,当您处理许多文件和目录,EnumerateFiles可以更有效。

最终没有解决方案——你可以让问题变小,但不能让问题消失。获取大量文件的DirectoryInfo对象(文件大小无关)是一个缓慢的操作,即使在本地,在网络上它只是花费时间。

10g网络可以提供一点帮助,更快的磁盘也可以,但这并不是针对高吞吐量进行优化的操作。