Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的Parallel.Foreach似乎没有使用10个线程?_C#_Parallel Processing_Parallel.foreach - Fatal编程技术网

C# 为什么我的Parallel.Foreach似乎没有使用10个线程?

C# 为什么我的Parallel.Foreach似乎没有使用10个线程?,c#,parallel-processing,parallel.foreach,C#,Parallel Processing,Parallel.foreach,似乎没有一种极端的平行主义。以下代码似乎只使用了1%的cpu,因此我怀疑它没有正确使用内核: Parallel.ForEach(lls, new ParallelOptions { MaxDegreeOfParallelism = 10 }, GetFileSizeFSO); 有没有办法强制使用10个内核/线程 其他信息: private void GetFileSizeFSO(List<string> l) { foreach (var dir in l) {

似乎没有一种极端的平行主义。以下代码似乎只使用了1%的cpu,因此我怀疑它没有正确使用内核:

Parallel.ForEach(lls, new ParallelOptions { MaxDegreeOfParallelism = 10 },  GetFileSizeFSO);
有没有办法强制使用10个内核/线程

其他信息:

private void GetFileSizeFSO(List<string> l)
{
    foreach (var dir in l)
    {

        var ds = GetDirectorySize3(dir);
        Interlocked.Add(ref _size, ds);
    }
}

    public static long GetDirectorySize3(string parentDirectory)
    {
        Scripting.FileSystemObject fso = new Scripting.FileSystemObject();
        Scripting.Folder folder = fso.GetFolder(parentDirectory);
        Int64 dirSize = (Int64)folder.Size;

        Marshal.ReleaseComObject(fso);


        return dirSize;
    }
你的函数GetFileSizeFSO做什么?如果它访问光盘上的文件,这必须是您的主要时间消耗。处理器速度太快,光盘赶不上处理器。所以,处理器有足够的时间在硬盘完成任务时空闲和等待

如果您需要优化代码,您最好考虑访问文件的效率,而不是100%加载处理器。

您的函数GetFileSizeFSO做什么?如果它访问光盘上的文件,这必须是您的主要时间消耗。处理器速度太快,光盘赶不上处理器。所以,处理器有足够的时间在硬盘完成任务时空闲和等待

如果您需要优化代码,您最好研究访问文件的效率,而不是100%加载处理器。

这称为MaxDegreeOfParallelism,而不是MinDegreeOfParallelism。并行是为CPU受限的工作而设计的——使用比CPU更多的线程毫无意义。听起来您的工作是受I/O限制的,而不是受CPU限制的,因此Parallel根本不是适合此工作的工具

理想情况下,找到一个异步API来完成您试图完成的任务——这是使用您现有资源的最佳方式。如果没有异步API,您就必须自己生成这些线程——不过不要期望看到CPU的使用情况。最重要的是,度量—很可能并行化工作负载根本不会提高吞吐量。例如,I/O可能已经饱和。

它被称为MaxDegreeOfParallelism,而不是MinDegreeOfParallelism。并行是为CPU受限的工作而设计的——使用比CPU更多的线程毫无意义。听起来您的工作是受I/O限制的,而不是受CPU限制的,因此Parallel根本不是适合此工作的工具


理想情况下,找到一个异步API来完成您试图完成的任务——这是使用您现有资源的最佳方式。如果没有异步API,您就必须自己生成这些线程——不过不要期望看到CPU的使用情况。最重要的是,测量-很可能并行化工作负载根本不会提高吞吐量,例如,I/O可能已经饱和。

简单的答案是-你不能

但你为什么要这么做。NET非常擅长选择使用的线程的最佳数量。MaxDegreeOfParallelism的使用是为了限制并行性,而不是强制它,例如,如果您不想将所有系统资源都提供给循环


顺便说一句,从函数名GetFileSizeFSO判断,我猜它从持久性存储中读取文件大小,这可以解释为什么CPU没有被充分利用。

简单的答案是-你不能

但你为什么要这么做。NET非常擅长选择使用的线程的最佳数量。MaxDegreeOfParallelism的使用是为了限制并行性,而不是强制它,例如,如果您不想将所有系统资源都提供给循环


顺便说一句,从函数名GetFileSizeFSO判断,我猜它会从持久性存储中读取文件大小,这可以解释为什么CPU没有被充分利用。

ManInMoon,您的CPU使用率可能很慢,因为您所做的工作内容可能受到存储机制的限制。10个内核访问同一硬盘以获取文件大小的速度可能不会比2个内核快,因为访问一个硬盘是一个相对昂贵的操作,比周围的C逻辑要贵得多

所以,你没有并行性问题,你有一个I/O问题


请注意,也许不要使用FSO,而是使用.NET。

ManInMoon,您的CPU使用率可能很低,因为您所做的工作内容可能受到存储机制的限制。10个内核访问同一硬盘以获取文件大小的速度可能不会比2个内核快,因为访问一个硬盘是一个相对昂贵的操作,比周围的C逻辑要贵得多

所以,你没有并行性问题,你有一个I/O问题


请注意,也许不要使用FSO,而是使用.NET。

GetFileSizeFSO的可能副本听起来像是与IO相关的东西。这个方法是否可以做任何CPU工作?为什么使用所有10个内核对您来说很重要?您有性能问题吗?通常,告诉线程池如何工作不是最好的主意。如果没有你的帮助,这项工作做得不错。你不能强迫.NET使用10个核心GetFileSizef的可能副本,所以听起来像是与IO相关的东西。这个方法对CPU有用吗?为什么它对你很重要
要使用全部10个核心吗?您有性能问题吗?通常,告诉线程池如何工作不是最好的主意。如果没有你的帮助,它的工作还不错。你不能强迫.NET使用10个coresI。我已经在我的问题中添加了额外的代码。我有非常大的文件夹和大量的文件,以及子文件夹。我正试图快速计算出文件夹的大小。这是非常非常慢的-所以我正在使用FSO,现在也尝试使它并行。@ManInMoon,你试过用非并行的方法来做吗?它可能看起来比并行解决方案快得多,因为HDD无法并行读取数据-每次不同线程请求某个内容时,它都会从一个位置跳到另一个位置,这可能会导致相同的情况,就像您将两个文件夹复制为两个不同的并行作业一样-这比逐个复制要慢很多倍。而且您还可以可能需要检查相关线程:实际上,我已经看到了这些线程。我已经做了很多测试,FSO和parallel是迄今为止我发现的最好的组合。正如你所建议的,我只是试图平衡负载以避免出现问题。我已经在我的问题中添加了额外的代码。我有非常大的文件夹和大量的文件,以及子文件夹。我正试图快速计算出文件夹的大小。这是非常非常慢的-所以我正在使用FSO,现在也尝试使它并行。@ManInMoon,你试过用非并行的方法来做吗?它可能看起来比并行解决方案快得多,因为HDD无法并行读取数据-每次不同线程请求某个内容时,它都会从一个位置跳到另一个位置,这可能会导致相同的情况,就像您将两个文件夹复制为两个不同的并行作业一样-这比逐个复制要慢很多倍。而且您还可以可能需要检查相关线程:实际上,我已经看到了这些线程。我已经做了很多测试,FSO和parallel是迄今为止我发现的最好的组合。正如你所建议的那样,我只是试图平衡负载以避免出现问题。