2010-02-13 24 views
7

के साथ विशाल ग्राफ पर चौड़ाई-पहली-खोज में वर्तमान में एक ग्राफ है जिसमें लगभग 10 मिलियन नोड्स और 35 मिलियन किनारों हैं। अब के लिए पूर्ण ग्राफ प्रोग्राम शुरू होने पर स्मृति में लोड किया गया है। इसमें कुछ मिनट लगते हैं (यह जावा के बाद सभी है) और रैम के आधा गीगाबाइट की आवश्यकता है। अभी के लिए यह एक मशीन पर एक दोहरी कोर प्रोसेसर और 4 गीगाबाइट रैम के साथ चलता है।छोटे रैम

जब ग्राफ को चौड़ाई-पहली खोज का उपयोग करके खोजा जाता है तो स्मृति उपयोग एक गीगाबाइट की चोटी तक बढ़ता है और औसत पर दस सेकंड लगते हैं।

मैं कुछ कंप्यूटरों पर प्रोग्राम को तैनात करना चाहता हूं। ग्राफ खोज के अलावा कार्यक्षमता बहुत कम संसाधन लेती है। मेरा लक्ष्य प्रणाली बहुत छोटा है और इसमें केवल 512 मेगाबाइट रैम है।

बहुत अधिक स्मृति का उपभोग किए बिना उस ग्राफ को खोजने के लिए किसी विधि को लागू करने के तरीके (शायद डेटाबेस का उपयोग करके) पर कोई सुझाव? यह कार्यक्रम अधिकांश समय तक निष्क्रिय होता है क्योंकि यह हार्डवेयर डिवाइस तक पहुंच रहा है, इसलिए पथ-खोज में उल्लिखित ग्राफ के लिए अधिकतम 5 मिनट लग सकते हैं ...

मेरी दिशा में किसी भी विचार को फेंकने के लिए धन्यवाद।

अद्यतन:

बस neo4j पाया। किसी को पता है कि यह इस तरह के विशाल ग्राफ के लिए उपयुक्त होगा?

+0

यदि यह संभव है (आपके कार्य पर निर्भर करता है) तो आप बीएफएस के पूर्ण विकल्पों का उपयोग नहीं कर सकते .. उदाहरण के लिए बीम खोज की तरह? आपकी खोज के मोर्चे को कम करने से आम तौर पर प्रदर्शन – anthares

+0

@IVlad no को बढ़ावा देता है, नोड्स 0 से 10000000 तक केवल एक पूर्णांक संख्या होते हैं। शेष डेटा एक्सएमएल फाइलों से – allesblinkt

+0

पर कुछ अजीब हुआ।आईवीएलएड की टिप्पणी सिर्फ – allesblinkt

उत्तर

8

आपका प्रश्न थोड़ा अस्पष्ट है, लेकिन आम तौर पर, एक अच्छी रणनीति जो ज्यादातर चौड़ाई के पहले अर्थशास्त्र का पालन करती है, वही स्मृति का उपयोग करते समय गहराई-पहली खोज Iterative Deepening है। विचार यह है कि आप पहली बार 1 स्तर तक सीमित गहराई से पहली खोज करते हैं; यदि वह समाधान ढूंढने में विफल रहता है, तो स्क्रैच से शुरू करें और इसे 2 स्तर तक सीमित करें; अगर यह विफल रहता है, तो 3 स्तरों को आजमाएं, और इसी तरह।

यह पहली बार में थोड़ा निरर्थक लग सकता है, लेकिन जब से तुम एक गहराई-पहले खोज कर रहे हैं, तो आप स्मृति में बहुत कम नोड्स रखने के लिए, और हमेशा एक सीधी चौड़ाई-पहले खोज से एक कम स्तर खोज करते हैं। चूंकि एक स्तर में नोड्स की मात्रा तेजी से बढ़ती है, बड़े ग्राफ पर, यह बहुत संभव है कि एक अंतिम अतिरिक्त स्तर को सहेजने से पहले की सभी परतों को अनावश्यक रूप से प्रयास करने के लिए भुगतान किया जाता है।

+0

मुझे अभी तक इटरेटिव गहराई के बारे में पता नहीं/सोचा है। यह वास्तविक खोज के कम से कम स्मृति उपयोग को हल करने के लिए पहले चरण की तरह लगता है। किसी भी अनुमान का अनुमान है कि फ़ाइल या डेटाबेस में वास्तविक डेटा ऑफ-रैम रखते समय कोई ग्राफ खोज कैसे करेगी? – allesblinkt

+0

आपके ग्राफ का प्रतिनिधित्व करने के तरीके के आधार पर। शायद आप इसे स्तर-दर-स्तर तक लोड कर सकते हैं जब तक कि आप समाधान न करें? प्रत्येक नोड के लिए डिस्क को सीधे पढ़ने के लिए सबसे अधिक संभावना प्रदर्शन के साथ विनाश को खत्म करने जा रहा है। –

+0

दिलचस्प। मुझे इसके लिए अनुकूलित एक अनुक्रमित फ़ाइल लिखने का प्रयास करना चाहिए। अभी के लिए फ़ाइल केवल एक ASCII सूची है जिसमें बहुत से संदर्भ हैं-> संदर्भित – allesblinkt

1

मैं कहूंगा कि Neo4j निश्चित रूप से जाने का एक अच्छा तरीका है जब आपके पास एक सभ्य आकार का ग्राफ है। न केवल इसमें अंतर्निहित बीएफएस एल्गोरिदम हैं, आप डिस्क पर डेटा भी बनाए रखेंगे, इस प्रकार आपके स्टार्ट-अप समय को कम कर देंगे।

इस highscalability.com पर बाहर की जाँच करें: NEO4J - A GRAPH DATABASE THAT KICKS BUTTOX

मैं Neo4j और उनके प्रलेखन का उपयोग किया है बहुत अच्छा है, और वे कुछ अच्छा हो रही शुरू कर दिया उदाहरण है, जो वास्तव में चलते रहने के लिए बस कुछ ही मिनटों लेते हैं प्रदान करते हैं।

चेक बाहर उनके - Getting started in 10 minutes guide

0
ग्राफ के रूप में डेटाबेस में

Neo4j डेटा को यह कायम हो जाता है और आप ग्राफ़ Traversal एपीआई (BFS, डीबीएस, ए * डिज्कस्ट्रा ...) का उपयोग कर, या साइफर क्वेरी का उपयोग उपयोग कर सकते हैं भाषा।

संबंधित मुद्दे