7

如何使用 PLINQ 在 C# 中实现 MapReduce?

假设,您有 7-8 个 Web 服务来收集数据,并且在每次接收(异步方式)时,您必须将该数据放入数据库的某些表中,在我的情况下是 SQL Server 2008。例如,您从每个接收到的数据网络服务是:

 <employees>
  <employee>
   <name>Ramiz</name>
  </employee>
  <employee>
   <name>Aamir</name>
  </employee>
  <employee>
   <name>Zubair</name>
  </employee>
</employees>

并且,在每次收到响应时,此数据都会进入一个表名 - Employee:

Employee
===
EmployeeID (PK)
EmployeeName

一旦数据进入表中,它必须返回json到客户端,即 ASP.NET (MVC 3) 应用程序正在使用客户端 JavaScript (ajax) 进行此调用。

假设一个 WebServiceEmployee1 已经返回了数据,而其他 6 个在队列中(仍在尝试获取数据)。然后,它应该将结果集注册到表中,而不是等待其他 6 个,并将插入的员工的数据以 json 的形式返回给客户端。并且,在其他人以同样的方式做时,保持联系并做。

请看,在我的工具带中,我有 ASP.NET MVC 3 (Razor)、SQL SERVER 2008 R2、jQuery。

谢谢。

4

2 回答 2

1

如果对您要执行的处理没有清楚的了解,我建议您阅读以下 MSDN 文档:http ://bit.ly/Ir7Nvk 它使用 PLINQ 描述了 map/reduce,示例如下:

public IDMultisetItemList PotentialFriendsPLinq(SubscriberID id, 
                                           int maxCandidates)
{
  var candidates = 
    subscribers[id].Friends.AsParallel()                    
    .SelectMany(friend => subscribers[friend].Friends)
    .Where(foaf => foaf != id && 
           !(subscribers[id].Friends.Contains(foaf)))
    .GroupBy(foaf => foaf)                               
    .Select(foafGroup => new IDMultisetItem(foafGroup.Key,
                                       foafGroup.Count()));
  return Multiset.MostNumerous(candidates, maxCandidates);
}

"map" 是Friends.AsParallel, SelectMany, andWhere和 "reduce" 阶段是GroupByandSelect

于 2012-05-04T03:30:46.637 回答
0

来自 MS 的这个 PDF 有一个 Map Reduce 示例朝向中间/端

http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&ved=0CH0QFjAE&url=http%3A%2F%2Fdownload.microsoft.com%2Fdownload%2F3%2F4%2FD%2F34D13993- 2132-4E04-AE48-53D3150057BD%2FPatterns_of_Parallel_Programming_CSharp.pdf&ei=4f_VT-ScD-Lg2gWqoeSWDw&usg=AFQjCNGhk_BZL8-5n8DaS_kMTaWRU9Y1Zw&sig2=ddKl4KuOGUIiUb1pIawWeNQ

public static IEnumerable<TResult> MapReduce<TSource, TMapped, TKey, TResult>(
this IEnumerable<TSource> source,
Patterns of Parallel Programming Page 76
Func<TSource, IEnumerable<TMapped>> map,
Func<TMapped, TKey> keySelector,
Func<IGrouping<TKey, TMapped>, IEnumerable<TResult>> reduce)
{
return source.SelectMany(map)
.GroupBy(keySelector)
.SelectMany(reduce);
}
于 2012-06-11T14:26:54.917 回答