如何在递归方法C#中解决内存错误



我的problm是我有一种递归方法,该方法给出了它在所有子文件夹中输入的路径,并将文件名和一些信息存储在数据库中。它可以正常工作,直到我使用一个具有31000个文件和许多子文件夹的文件夹为止。我对该方法的参数是他正在工作的路径,作为数据库类的父路径和数据库类,以执行一些插入和选择。我的问题是,通过使用REF关键字,它将有助于记忆问题?

对不起,如果有一篇文章。我什么都没找到。

public void ManageFiles(string path, Table Father, DataBaseHandlerClass DB)
{
    try
    {
        log.Info("---------------------------Inicio Pasta " + path + "--------------------------");
        DirectoryInfo d = new DirectoryInfo(path);
        DirectoryInfo[] Dirs = d.GetDirectories();
        int hashCode = path.GetHashCode();
        IFB_FilePath FilePath = DB.InsertOrUpdatePath(hashCode, path, Father == null ? null : (int?)Father.ID);
        foreach (var newPath in Dirs)
        {
            ManageFiles(newPath.FullName, FilePath, DB);
        }
        List<string> ext = DB.GetExtensionsToSearch();
        FileInfo[] Files = d.GetFiles("*.*").Where(s => ext.Contains(s.Extension.ToLower())).ToArray();
        var watch = System.Diagnostics.Stopwatch.StartNew();
        foreach (FileInfo file in Files)
        {
            watch = System.Diagnostics.Stopwatch.StartNew();
            FileTable Ficheiro = DB.InsertOrUpdateFile(file, FilePath);
            if (Ficheiro.ID_Extension_Group == 1 && !Ficheiro.Metadata.Any())
            {
                CreateFileMetadata(DB, Ficheiro);
            }
            else
            {
                if (Ficheiro.ID_Extension_Group == 1 && Ficheiro.TakenDate == null)
                {
                    UpdateTakenDate(DB, Ficheiro);
                }
            }
            watch.Stop();
            log.Info("Tempo em ms: " + watch.ElapsedMilliseconds + " Ficheiro " + file.Name);
        }
        log.Info("---------------------------Fim Pasta " + path + "--------------------------");
    }
    catch (Exception Ex)
    {
        log.Error(Ex);
    }
}

尽管递归很美,有时需要更少的代码,但我建议您将其拆开。C#具有递归深度,然后超过运行时引发错误。

但是,如果不是重写代码,则可以获取更大的递归限制。

正如本网站所说,嵌套在C#中的大小,就像14250通话一样大。因此,在您的情况下,调用功能超过此限制。

我认为您应该将以下几行移动到ManageFiles函数之外:

 DirectoryInfo d = new DirectoryInfo(path);
 DirectoryInfo[] Dirs = d.GetDirectories();
 int hashCode = path.GetHashCode();

这是因为您正在创建一个新的DirectoryInfo对象,并且每个调用函数的目录集合。这是我会做出的第一个更改,因为它肯定会对记忆产生影响。

最新更新