इस समस्या से चिंतित होने वाली पहली बात यह है कि डेटा की आवश्यकता कहां और कब होती है। ऐसा करने के लिए, मैं आमतौर पर समस्या के बेवकूफ, धारावाहिक संस्करण के साथ शुरू करता हूं।
एक्स $ / एकड़ से अधिक मूल्य वाले सभी पार्सल का पता लगाएं, जो दूसरे पार्सल के y फीट के भीतर हों, जिनकी कीमत z $ / एकड़ से कम हो।
foreach p in parcels {
if value(p) > x {
foreach q in parcels {
if (dist(p,q) <= y) and (value(q) < z) {
emit(p)
}
}
}
}
जबकि यह एल्गोरिथ्म अनुकूलित नहीं है, यह समस्या को हल करेगा।
मैंने अपने मास्टर की थीसिस के लिए इसी तरह की समस्या को हल किया जो एक डेटासेट में हर बिंदु के लिए निकटतम पार्सल पाया। मैंने PostGIS , Hadoop
और MPI में समाधान लागू किया । मेरी थीसिस का पूर्ण संस्करण यहां है , लेकिन मैं महत्वपूर्ण बिंदुओं को संक्षेप में बताऊंगा क्योंकि यह इस समस्या पर लागू होता है।
MapReduce इस समस्या को हल करने के लिए एक अच्छा प्लेटफ़ॉर्म नहीं है क्योंकि इसके लिए पापी पार्सल को संसाधित करने के लिए संपूर्ण डेटासेट (या सावधानीपूर्वक चयनित सब्मिट) तक पहुंच की आवश्यकता होती है। MapReduce माध्यमिक डेटासेट को अच्छी तरह से संभाल नहीं करता है।
MPI, हालांकि, यह काफी हाथ से हल कर सकते हैं। सबसे कठिन हिस्सा यह निर्धारित कर रहा है कि डेटा को कैसे विभाजित किया जाए। यह विभाजन इस बात पर आधारित है कि इसमें कितना डेटा है, आपको इसे चलाने के लिए कितने p rocessors और प्रति प्रोसेसर की कितनी मेमोरी है। सर्वोत्तम स्केलिंग (और इसलिए प्रदर्शन) के लिए आपको एक बार मेमोरी में पार्सल डेटासेट की कई प्रतियां (आपके सभी कंप्यूटरों में) की आवश्यकता होगी।
यह समझाने के लिए कि यह कैसे काम करता है, मैं मानूंगा कि आपके प्रत्येक 50 कंप्यूटर में 8 प्रोसेसर हैं। फिर मैं प्रत्येक कंप्यूटर को पार्सल के 1/50 हिस्से की जांच करने की जिम्मेदारी दूंगा। इस जाँच को कंप्यूटर पर 8 प्रक्रियाओं द्वारा निष्पादित किया जाएगा, जिनमें से प्रत्येक में पार्सल के 1/50 भाग और पार्सल डेटासेट के 1/8 भाग की एक प्रति है। कृपया ध्यान दें कि समूह एक मशीन तक सीमित नहीं हैं, लेकिन मशीन की सीमाओं को पार कर सकते हैं।
यह प्रक्रिया एल्गोरिथ्म को निष्पादित करेगी, पार्सल के 1/50 वें सेट से पी के लिए पार्सल और 1/8 वें सेट से क्यू के लिए पार्सल प्राप्त करेगी। आंतरिक लूप के बाद, एक ही कंप्यूटर पर सभी प्रक्रियाएं यह निर्धारित करने के लिए एक साथ बात करेंगी कि क्या पार्सल को उत्सर्जित किया जाना चाहिए।
मैंने अपनी समस्या के लिए इसी तरह का एल्गोरिदम लागू किया। आप स्रोत यहां पा सकते हैं ।
यहां तक कि इस तरह के गैर-अनुकूलित एल्गोरिथ्म के साथ मैं प्रभावशाली परिणाम प्राप्त करने में सक्षम था जो प्रोग्रामर समय के लिए अत्यधिक अनुकूलित थे (जिसका अर्थ है कि मैं एक बेवकूफ सरल एल्गोरिथ्म लिख सकता था और गणना अभी भी काफी तेज होगी)। अनुकूलन करने के लिए अगला स्थान (यदि आपको वास्तव में इसकी आवश्यकता है), प्रत्येक प्रक्रिया के लिए दूसरे डेटासेट (जहां आपको q से प्राप्त होता है) का एक क्वाडट्री इंडेक्स सेटअप करना है।
मूल प्रश्न का उत्तर देने के लिए। एक वास्तुकला है: MPI + GEOS। मेरे ClusterGIS कार्यान्वयन से थोड़ी मदद और काफी कुछ किया जा सकता है। यह सभी सॉफ़्टवेयर खुले स्रोत के रूप में मिल सकते हैं, इसलिए लाइसेंस शुल्क नहीं। मुझे यकीन नहीं है कि विंडोज के लिए यह कितना पोर्टेबल है (शायद Cygwin के साथ) जैसा कि मैंने लिनक्स में इस पर काम किया है। इस समाधान को EC2, रैकस्पेस या जो भी बादल उपलब्ध है, पर तैनात किया जा सकता है। जब मैंने इसे विकसित किया तो मैं एक विश्वविद्यालय में एक समर्पित कम्प्यूट क्लस्टर का उपयोग कर रहा था।