2012-04-12 22 views
7

Làm cách nào để triển khai MapReduce trong C# bằng PLINQ?Làm cách nào để triển khai MapReduce trong C# bằng PLINQ?

Giả sử, bạn có 7-8 WebServices để thu thập dữ liệu và trên mỗi lần nhận (không đồng bộ) bạn phải đặt dữ liệu đó vào một số bảng của cơ sở dữ liệu, trong trường hợp của tôi là SQL Server 2008. Ví dụ: dữ liệu bạn đang nhận được từ mỗi Web Service là:

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

Và, trên mỗi nhận phản ứng dữ liệu này đi vào một tên bảng - Nhân viên:

Employee 
=== 
EmployeeID (PK) 
EmployeeName 

một khi dữ liệu đi vào bảng, nó phải trở lại là json cho khách hàng là ứng dụng ASP.NET (MVC 3) ion đang thực hiện cuộc gọi này bằng cách sử dụng JavaScript phía máy khách (ajax).

Giả sử, WebServiceEmployee1 đã trả về với dữ liệu và 6 khác nằm trong hàng đợi (vẫn đang cố lấy dữ liệu). Sau đó, nó sẽ đi đăng ký resultset vào bảng thay vì chờ đợi 6 khác và trả về dữ liệu của nhân viên được chèn vào máy khách trong json. Và, giữ cho nó kết nối và làm trong khi những người khác làm theo cùng một cách.

Xin vui lòng xem, trong toolbelt của tôi Tôi có ASP.NET MVC 3 (Razor), SQL SERVER 2008 R2, jQuery.

Cảm ơn.

+0

Pleas cho chúng ta một ví dụ đơn giản của dữ liệu bạn đang đi để xử lý và kết quả xử lý mà bạn mong đợi để có được ở cuối. –

+0

@ achitaka-san Tôi đã cập nhật bài đăng. –

+0

Tôi đã xóa câu trả lời của mình vì tôi không hiểu hoàn cảnh của bạn và cách bạn có thể sử dụng MapReduce có hoặc không có linq – Nikolay

Trả lời

1

Nếu không có sự hiểu biết rõ ràng về việc xử lý bạn muốn thực hiện, tôi khuyên bạn nên đọc mặc dù các tài liệu MSDN sau đây: http://bit.ly/Ir7Nvk Nó mô tả bản đồ/giảm với PLINQ với các ví dụ như:

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); 
} 

Các "bản đồ" là Friends.AsParallel, SelectMany, và Where và "giảm" giai đoạn là GroupBySelect

0

PDF này từ MS đã một bản đồ giảm dụ theo hướng giữa/cuối

0.123.

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=ddKl4KuOGUiUb1pIawWeNQ

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); 
} 
Các vấn đề liên quan