【发布时间】:2012-03-30 13:17:19
【问题描述】:
我有一个非常简单的 Parallel.ForEach 调用下面的代码:
var maxDegree = new ParallelOptions{MaxDegreeOfParallelism = 5};
Parallel.ForEach(PList,maxDegree,fl =>
{
ProjectDirectoryProcessing pjp = new ProjectDirectoryProcessing();
pjp.ProjectProcessor(fl);
Console.ReadLine();
}
);
public class ProjectDirectoryProcessing
{
public void ProjectProcessor(string rootDirectory)
{
DirectoryInfo Dinfo = new DirectoryInfo(rootDirectory);
DirectoryInfo[] directories = Dinfo.GetDirectories("*.*", SearchOption.AllDirectories);
FileInfo[] finfo = Dinfo.GetFiles("*.*", SearchOption.AllDirectories);
foreach (FileInfo f in finfo)
{
FileSize = FileSize + f.Length;
}
FileCount = finfo.Length;
DirectoryCount = directories.Length;
}
}
问题是我的内存不足,我在 Parallel.ForEach 中的 pjp.ProjectProcessor 之后考虑了 GC.Collect() 但我不确定这是否可行。这些目录非常大,我不肯定清理这些目录会有所帮助。有什么好的方法来处理这个问题?
【问题讨论】:
-
这取决于您需要对文件执行的操作。
Directory.EnumerateFiles可能会产生巨大的影响。 -
查看编辑,我只是在计算目录的大小和文件数,而 Directory.EnumerateFiles 会导致巨大的性能问题
-
您的应用程序到底应该做什么?不能切换到生产者-消费者模型,一个一个地加载文件夹吗?
-
@Tudor 我实际上尝试了这种方法并且性能非常好,例如时间从上面的 52 分钟变成了大约 4 小时。
-
@Mike:你是使用一个线程来引导目录还是多个并行?
标签: c# multithreading directoryinfo