【问题标题】:GetPartitions got skewed partitions?GetPartitions 有偏斜的分区?
【发布时间】:2018-06-06 17:15:41
【问题描述】:

在 C# 交互窗口中运行以下代码

using System.Collections.Concurrent;

var l = Enumerable.Range(0, 20);

Partitioner.Create(l).GetPartitions(4)
  .Select(x => { 
    var s = ""; 
    while (x.MoveNext()) { s += x.Current.ToString() + ","; }; 
    return s; 
  })

返回

Enumerable.WhereSelectArrayIterator<IEnumerator<int>, string>
  { "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,", "", "", "" }

似乎一个分区获得了所有值?我尝试了大尺寸Enumerable.Range(0, 12000) 并且所有元素仍然在第一个分区中。


我想确保下面的扩展方法可以均匀地划分列表。

public static Task ForEachAsync<T>(this IEnumerable<T> source, int dop, Func<T, Task> body)
{
    return Task.WhenAll(
        from partition in Partitioner.Create(source).GetPartitions(dop)
        select Task.Run(async delegate {
            using (partition)
                while (partition.MoveNext())
                    await body(partition.Current);
        }));
}

【问题讨论】:

标签: c# plinq


【解决方案1】:

我会说是你的代码导致了它:你只枚举了一个分区,但分区是根据请求“填充”的。

你想要一个简单的测试吗?

Partitioner.Create(l).GetPartitions(4)
  .Skip(1)
  .Select(x => { 
    var s = ""; 
    while (x.MoveNext()) { s += x.Current.ToString() + ","; }; 
    return s; 
  })

现在是另一个获取所有值的分区 :-) 但是不是第一个获取所有值的分区吗?现在是第二个:-)

更正确的测试是:

var l = Enumerable.Range(0, 20);

var parts = Partitioner.Create(l).GetPartitions(4);

string[] bufs = new string[parts.Count];

while (true)
{
    int countFinished = 0;
    for (int i = 0; i < parts.Count; i++)
    {
        if (parts[i].MoveNext())
        {
            bufs[i] += parts[i].Current + ",";
        }
        else
        {
            countFinished++;
        }
    }
    if (countFinished == parts.Count)
    {
        break;
    }
}

for (int i = 0; i < parts.Count; i++)
{
    Console.WriteLine(bufs[i]);
}

我同时枚举了四个分区。这将在分区之间平均分配所有数字。

【讨论】:

  • 我已经更新了问题。我想确保扩展方法可以对列表进行均匀分区,可以吗?
  • @ca9163d9 不知道。我没用plinq,所以什么都不懂……我给你的回复是凭感觉
  • 它歪了。我已经发布了另一个问题stackoverflow.com/questions/50727086/…
  • @ca9163d9 - 我注意到了同样的事情,想知道您是否设法“取消倾斜”该方法?我用的是和你一样的扩展方法
猜你喜欢
  • 1970-01-01
  • 2014-01-17
  • 2014-02-20
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多