मेरे पास एक डेटा सेट है जो एक बड़े वजन वाले चक्रीय ग्राफ है चक्र लगभग 5-6 पथों की लूप में होते हैं। इसमें लगभग 8000 नोड होते हैं और प्रत्येक नोड में 1-6 (आमतौर पर लगभग 4-5) कनेक्शन होते हैं। मैं एकल जोड़ी सबसे छोटी पथ गणना कर रहा हूं और चौड़ाई-पहली खोज करने के लिए निम्नलिखित कोड लागू किया है।क्या यह चौड़ाई पहली खोज तेज हो सकती है?
from Queue import Queue
q = Queue()
parent = {}
fromNode = 'E1123'
toNode = 'A3455'
# path finding
q.put(fromNode)
parent[fromNode] = 'Root'
while not q.empty():
# get the next node and add its neighbours to queue
current = q.get()
for i in getNeighbours(current):
# note parent and only continue if not already visited
if i[0] not in parent:
parent[i[0]] = current
q.put(i[0])
# check if destination
if current == toNode:
print 'arrived at', toNode
break
ऊपर कोड अजगर 2.6 कतार मॉड्यूल और getNeighbours() का उपयोग करता है बस एक सबरूटीन एक भी MySQL कॉल बनाता है और tuples जैसे की एक सूची के रूप में पड़ोसियों रिटर्न (('Foo',), ('बार',))। एसक्यूएल कॉल जल्दी है।
कोड काम करता है ठीक है लेकिन करने के लिए नीचे के बारे में 7 परतों की गहराई में परीक्षण चलाने के लिए के बारे में 20 सेकंड लेता है (2.5GHz इंटेल 4GB RAM ओएस एक्स 10,6)
मैं कैसे रन में सुधार करने के बारे में कोई टिप्पणी का स्वागत करते हैं चाहते हैं इस कोड का समय
सेकेंड, 8000 नोड्स मेमोरी में आसानी से फिट होंगे। –
अच्छी कॉल! नोड जानकारी वाली तालिका नोड, टू नोड से बस पंक्तियां है। मैं बस इसे स्मृति में लोड करने की जांच करूंगा..यह सिर्फ एक बड़ी शब्दकोश संरचना है। – timbo
एक साधारण परीक्षण के रूप में, मैंने CREATE तालिका परिभाषा पर केवल ENGINE = MEMORY का उपयोग करके MySQL को मेमोरी में लोड किया है। वही कोड अब लगभग 2.5 सेकंड में पूरा हो जाता है! – timbo