Điều đầu tiên cần quan tâm với vấn đề này là dữ liệu nào là cần thiết ở đâu và khi nào. Để làm như vậy, tôi thường bắt đầu với phiên bản nối tiếp ngu ngốc của vấn đề.
Tìm tất cả các bưu kiện có giá trị trên x $ / mẫu Anh trong phạm vi y của một bưu kiện khác có giá trị nhỏ hơn z $ / mẫu.
foreach p in parcels {
if value(p) > x {
foreach q in parcels {
if (dist(p,q) <= y) and (value(q) < z) {
emit(p)
}
}
}
}
Trong khi thuật toán này không được tối ưu hóa, nó sẽ giải quyết vấn đề.
Tôi đã giải quyết một vấn đề tương tự cho luận án thạc sĩ của tôi, trong đó tìm thấy bưu kiện gần nhất cho mọi điểm trong bộ dữ liệu. Tôi đã triển khai giải pháp trong PostGIS , Hadoop
và MPI . Phiên bản đầy đủ của luận án của tôi ở đây , nhưng tôi sẽ tóm tắt những điểm quan trọng khi nó áp dụng cho vấn đề này.
MapReduce không phải là một nền tảng tốt để giải quyết vấn đề này bởi vì nó yêu cầu quyền truy cập vào toàn bộ tập dữ liệu (hoặc một tập hợp con được chọn cẩn thận) để xử lý một bưu kiện tội lỗi. MapReduce không xử lý tốt các bộ dữ liệu thứ cấp.
MPI, tuy nhiên, có thể giải quyết điều này khá thủ công. Phần khó nhất là xác định cách phân chia dữ liệu. Sự phân chia này dựa trên số lượng dữ liệu, bao nhiêu p ressess bạn phải chạy nó và bao nhiêu bộ nhớ cho mỗi bộ xử lý. Để mở rộng tốt nhất (và do đó hiệu suất), bạn sẽ cần phải có nhiều bản sao của tập dữ liệu bưu kiện trong bộ nhớ (trên tất cả các máy tính của bạn) cùng một lúc.
Để giải thích cách thức hoạt động của nó, tôi sẽ giả sử rằng mỗi 50 máy tính của bạn có 8 bộ xử lý. Sau đó tôi sẽ giao cho mỗi máy tính trách nhiệm kiểm tra 1/50 bưu kiện. Việc kiểm tra này sẽ được thực hiện bởi 8 quy trình trên máy tính, mỗi quy trình có một bản sao của cùng một phần 1/50 của bưu kiện và 1/8 bộ dữ liệu bưu kiện. Xin lưu ý rằng các nhóm không giới hạn trong một máy, nhưng có thể vượt qua ranh giới máy.
Quá trình sẽ thực hiện thuật toán, lấy các bưu kiện cho p từ bộ bưu kiện 1/50 và bưu kiện cho q từ bộ 1/8. Sau vòng lặp bên trong, tất cả các quy trình trên cùng một máy tính sẽ nói chuyện với nhau để xác định xem có nên phát ra bưu kiện hay không.
Tôi đã thực hiện một thuật toán tương tự như vậy cho vấn đề của tôi. Bạn có thể tìm thấy nguồn ở đây .
Ngay cả với loại thuật toán không được tối ưu hóa này, tôi đã có thể thu được kết quả ấn tượng được tối ưu hóa cao cho thời gian lập trình viên (có nghĩa là tôi có thể viết một thuật toán đơn giản ngu ngốc và tính toán vẫn đủ nhanh). Điểm tiếp theo để tối ưu hóa (nếu bạn thực sự cần nó), là thiết lập một chỉ mục tứ giác của tập dữ liệu thứ hai (nơi bạn nhận q từ) cho mỗi quy trình.
Để trả lời câu hỏi ban đầu. Có một kiến trúc: MPI + GEOS. Sử dụng một chút trợ giúp từ việc triển khai ClusterGIS của tôi và có thể thực hiện được rất nhiều việc. Tất cả phần mềm này có thể được tìm thấy dưới dạng nguồn mở, do đó không có phí cấp phép. Tôi không chắc nó có khả năng di động với Windows như thế nào (có thể với Cygwin) khi tôi làm việc với nó trong linux. Giải pháp này có thể được triển khai trên EC2, Rackspace hoặc bất kỳ đám mây nào có sẵn. Khi tôi phát triển nó, tôi đang sử dụng một cụm tính toán chuyên dụng tại một trường đại học.