【问题标题】:C# coding guideline of how to use AsParallel() / Parellel.ForEach()如何使用 AsParallel() / Parellel.ForEach() 的 C# 编码指南
【发布时间】:2012-12-15 13:30:40
【问题描述】:

我想计算 10 000 个文本的 Jaccard 相似度。 Jaccard 相似度很容易计算:相交的长度除以并集的长度。

string sTtxt1 = "some text one";
string sTtxt2 = "some text two";
string sTtxt3 = "some text three";
HashSet<string[]> hashText= new HashSet<string[]>();
hashText.Add(sTtxt1);
hashText.Add(sTtxt2);
hashText.Add(sTtxt3);
double[,] dSimilarityValue;

for (int i = 0; i < hashText.Count; i++)
{
   dSimilarityValue[i, i] = 100.00;
   for (int j = i + 1; j < dSimilarityValue.Count; j++)
   {
      dSimilarityValue[i, j] = (double) hashText.ElementAt(i).Intersect(hashText.ElementAt(j)).Count() / (double) hashText.ElementAt(i).Union(hashText.ElementAt(j)).Count();
   }
}

对于 .NET4,我应该使用哪些规则来并行化?

谢谢!

【问题讨论】:

    标签: c# .net multithreading parallel-processing


    【解决方案1】:

    只需让内循环并行

    Parallel Class

    Parallel.For(0, N, i =>
    {
       // Do Work.
    }); 
    
    
    Parallel.For(j, dSimilarityValue.Count, i =>
    {
       dSimilarityValue[i, j] = 
        (double)hashText.ElementAt(i).Intersect(hashText.ElementAt(j)).Count() / 
        (double)hashText.ElementAt(i).Union(hashText.ElementAt(j)).Count();
    });
    

    而且我认为最好在 new 中声明数组的大小。
    不知道你所说的“规则”是什么意思。

    【讨论】:

    • Blam,通过“规则”,我想说“方法”(对不起,我的英语很差,我是法国人;)) Parallel.For() 很好。我将处理时间减少了 10 个。感谢四位您的帮助。我测试了(double)hashText.AsParallel().ElementAt(i).Intersect(hashText.ElementAt(j)).Count() / (double)hashText.AsParallel().ElementAt(i).Union(hashText.ElementAt(j)).Count();,但性能下降了
    • ElementAt() 是单数的,因此它不能启动多个线程。该内部循环是并行的逻辑点。
    • 所以使用另一个数据结构 HashSet &lt;string[]&gt; 来并行化 Intersect() 和 Union()。但是哪一个?
    • HashSet 很好。正如我所说,内部循环是并行的逻辑点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2010-12-02
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多