2008-11-08 33 views
6

Tôi có nhiều máy tính không sử dụng ở nhà. Điều gì sẽ là cách dễ nhất để tôi sử dụng chúng để song song chương trình C# của tôi với những thay đổi nhỏ hoặc không có mã?Cách dễ nhất để song song chương trình C# của tôi trên nhiều máy tính là gì

Nhiệm vụ mà tôi đang cố gắng thực hiện liên quan đến lặp qua rất nhiều câu tiếng Anh, tập dữ liệu có thể dễ dàng được chia thành các phần nhỏ hơn, được xử lý trong các máy khác nhau đồng thời.

+0

Bạn có thể tiết lộ những gì bạn đang cố gắng để hoàn thành? Bạn đã xem xét một cơ sở dữ liệu và/hoặc chỉ mục văn bản đầy đủ cho các nhu cầu của bạn chưa? – vmarquez

+0

Chi tiết là bắt buộc. Theo câu hỏi của bạn, chúng ta có giả định sự song song là để cải thiện tốc độ của một lần chạy đơn lẻ không? Nó cũng có thể được xem xét rằng bạn chỉ đơn giản là tìm cách để thực hiện các hoạt động tương tự trên một số máy- trong đó có một câu trả lời hoàn toàn khác nhau. – Klathzazt

Trả lời

2

Điều đó có thể không thực hiện được.

Cách song song chương trình tùy thuộc hoàn toàn vào chương trình của bạn và cách chương trình được viết và thường yêu cầu thay đổi mã rộng và tăng độ phức tạp của chương trình nhiều lần.

Cách thông thường để dễ dàng tăng tính đồng nhất trong chương trình là thực hiện tác vụ lặp lại nhiều lần và chỉ viết một hàm tách nhiệm vụ đó thành các phần và gửi chúng đến các lõi khác nhau để xử lý.

7

… với ít hoặc không có thay đổi mã nào?

Khó khăn. Về cơ bản, nhìn vào WCF như một cách để giao tiếp giữa các trường hợp khác nhau của chương trình trên mạng. Tùy thuộc vào thuật toán, cấu trúc có thể phải được thay đổi đáng kể hoặc hoàn toàn không. Trong mọi trường hợp, bạn phải tìm cách tách rời vấn đề thành các phần hoạt động độc lập với nhau. Sau đó, bạn phải nghĩ ra cách phân phối các phần này giữa các trường hợp khác nhau và thu thập dữ liệu kết quả.

PLinq cung cấp một cách tuyệt vời để song song chương trình của bạn mà không có thay đổi lớn nhưng điều này chỉ hoạt động trên một quy trình, trên các chủ đề khác nhau, và sau đó chỉ khi thuật toán cho chính nó song song. Nói chung, một số tái cấu trúc thủ công cần thiết.

1

Bạn cần chạy ứng dụng của mình trên hệ thống phân tán, google cho cửa sổ tính toán phân tán hoặc để tính toán lưới C#.

2

Câu trả lời tùy thuộc vào bản chất công việc mà ứng dụng của bạn sẽ thực hiện. Các loại công việc khác nhau có các giải pháp song song có thể khác nhau. Đối với một số loại không có cách nào khả thi/khả thi để song song.

Kịch bản dễ nhất mà tôi có thể nghĩ là dành cho ứng dụng hoạt động có thể dễ dàng bị hỏng trong các khối công việc riêng biệt. Nếu đây là trường hợp, sau đó bạn chỉ cần thiết kế ứng dụng của bạn để làm việc trên một đoạn công việc duy nhất. Cung cấp ứng dụng của bạn với khả năng chấp nhận công việc mới và phân phối các công việc đã hoàn thành. Sau đó, xây dựng một công việc lên lịch trên đầu trang của nó. Bộ lập lịch này có thể là một phần của cùng một ứng dụng (định cấu hình một máy làm bộ lập lịch và phần còn lại là ứng dụng khách) hoặc một ứng dụng riêng biệt.

Có nhiều thứ khác cần xem xét: Làm thế nào sẽ xảy ra giao tiếp giữa các máy (tệp ?, kết nối mạng?); ứng dụng cần có khả năng báo cáo/be_queried về phần trăm công việc đã hoàn thành ?; có một nhu cầu để có thể buộc các ứng dụng để ngăn chặn việc xử lý công việc hiện tại ?; v.v.)

Nếu bạn cần câu trả lời chi tiết hơn, hãy chỉnh sửa câu hỏi của bạn và bao gồm chi tiết về ứng dụng, vấn đề mà ứng dụng giải quyết, số lượng công việc dự kiến, v.v. Sau đó, cộng đồng sẽ có câu trả lời cụ thể hơn.

1

Mỗi câu được xử lý độc lập, hoặc chúng được kết hợp bằng cách nào đó? Nếu xử lý của bạn hoạt động trên một câu duy nhất tại một thời điểm, bạn không cần phải thay đổi mã của bạn cả.Chỉ cần thực hiện cùng một mã trên mỗi máy của bạn và chia dữ liệu (danh sách câu của bạn) giữa chúng. Bạn có thể làm điều này bằng cách cài đặt một phần dữ liệu trên mỗi máy, hoặc bằng cách chia sẻ cơ sở dữ liệu và gán một đoạn khác nhau cho mỗi máy.

Nếu bạn muốn để thay đổi mã của bạn một chút để tạo điều kiện song song, chia sẻ toàn bộ cơ sở dữ liệu và đánh dấu câu chưa được đánh dấu tiếp theo để xử lý. Điều này sẽ cung cấp cho bạn một giới thiệu nhẹ nhàng với khái niệm về thread safety - các kỹ thuật đảm bảo một bộ vi xử lý không gây trở ngại cho người khác.

Như thường lệ, bạn có thể cung cấp thêm chi tiết về ứng dụng cụ thể của bạn, cộng đồng SO có thể điều chỉnh câu trả lời của chúng tôi tốt hơn cho mục đích của bạn.

Chúc may mắn - điều này nghe giống như một dự án thú vị!

0

Trước khi tôi đầu tư song song chương trình của bạn, tại sao không chỉ cố gắng chia nhỏ bộ dữ liệu thành từng phần và chạy chương trình của bạn trên mỗi máy tính và đối chiếu kết quả đầu ra bằng tay. Nếu nó hoạt động, sau đó thử tự động hóa nó bằng các tập lệnh và viết một chương trình để đối chiếu các kết quả đầu ra.

2

Dryad (biến thể của Microsoft MapReduce) giải quyết chính xác vấn đề này (song song các chương trình .net trên nhiều máy tính). Nó đang ở giai đoạn nghiên cứu ngay bây giờ. Rất tệ, chưa có CTP nào :-(

+0

[đã ngừng] (http://www.zdnet.com/blog/microsoft/microsoft-drops-dryad-puts-its-big-data-bets-on-hadoop/11226) – kmote

0

Bạn có thể muốn xem Flow-Based Programming - nó có triển khai Java và C#. Hầu hết các phương pháp tiếp cận cho vấn đề này liên quan đến việc cố gắng để có một chương trình đơn luồng thông thường và tìm ra những phần có thể chạy song song. FBP có cách tiếp cận khác: ứng dụng được thiết kế ngay từ đầu về nhiều thành phần "hộp đen" chạy không đồng bộ (nghĩ về một dây chuyền sản xuất). Vì một chương trình đơn luồng thông thường hoạt động giống như một thành phần duy nhất trong môi trường FBP, rất dễ dàng để mở rộng một ứng dụng hiện có. Trên thực tế, các phần của ứng dụng hiện có thường có thể bị hỏng và chuyển thành các thành phần riêng biệt, miễn là chúng có thể chạy không đồng bộ với phần còn lại của ứng dụng (tức là không phải chương trình con). Có người gọi đây là "biến tảng băng trôi thành khối băng").

Các vấn đề liên quan