2009-03-31 6 views
12

की वृद्धिशील रैखिकरण मैं GitX का लेखक हूं। GitX की सुविधाओं में से एक शाखाओं का दृश्य है, जैसा कि here देखा जा सकता है।गिट डीएजी

यह विज़ुअलाइज़ेशन वर्तमान में काम करने के द्वारा किया जाता है जो सही क्रम में गिट से उत्सर्जित होते हैं। प्रत्येक प्रतिबद्धता के लिए माता-पिता ज्ञात हैं, इसलिए सही तरीके से लेन बनाने के लिए यह काफी आसान है।

मैं अपने स्वयं के प्रतिबद्ध पूल का उपयोग करके और खुद को प्रतिबद्ध करने के लिए इस प्रक्रिया को तेज करना चाहता हूं। यह मुझे मौजूदा लोड किए गए कामों का पुन: उपयोग करने की अनुमति देता है और गिट को उत्सर्जित करने की इजाजत देता है क्योंकि इसे सही क्रम में उत्सर्जित करने की आवश्यकता नहीं होती है।

हालांकि, मुझे यकीन नहीं है कि इसे पूरा करने के लिए क्या एल्गोरिदम उपयोग करना है। यह महत्वपूर्ण है कि इमारत बढ़ती जा रही है, क्योंकि कामों की लोडिंग में काफी समय लग सकता है (> 100,000 कामों के लिए 5 सेकंड, जो सभी प्रदर्शित किए जाने चाहिए)।

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

मुझे यह एल्गोरिदम भी कुशल होना पसंद है, क्योंकि इसे सैकड़ों हजारों कामों को संभालना होगा। इसे एक टेबल में भी प्रदर्शित किया जाना चाहिए, इसलिए यह महत्वपूर्ण है कि विशिष्ट पंक्तियों तक पहुंच तेज हो।

मैं अब तक के इनपुट का वर्णन करूंगा, जो आउटपुट मैं चाहता हूं और कुछ अवलोकन।

इनपुट:

  • मैं एक हैश तालिका वस्तुओं प्रतिबद्ध करने के लिए आईडी प्रतिबद्ध नक्शे कि के रूप में प्रतिबद्ध के एक वर्तमान पूल है। इस पूल को पूरा नहीं होना चाहिए (सभी आवश्यक हैं)
  • मेरे पास गिट से नए कामों में एक अलग थ्रेड लोडिंग है, कॉलबैक के साथ जिसे हर बार एक नई प्रतिबद्धता लोड किया जा सकता है। कोई गारंटीकृत आदेश नहीं है जिसमें कमेटी आती है, लेकिन ज्यादातर मामलों में अगली प्रतिबद्धता पिछले प्रतिबद्धता का अभिभावक है।
  • एक प्रतिबद्ध वस्तु का अपना संशोधन आईडी और उसके सभी माता-पिता के संशोधन आईडी
  • मेरे पास शाखा प्रमुखों की एक सूची है जो सूचीबद्ध होना चाहिए। यही है, डीएजी का एक भी 'टॉप' नहीं है जिसे प्रदर्शित किया जाना चाहिए। एक ग्राफ ग्राउंड रूट भी नहीं है।

आउटपुट:

  • मैं संस्थानिक क्रम में इन प्रतिबद्ध linearize की आवश्यकता होगी। यही है, उसके माता-पिता सूचीबद्ध होने के बाद एक प्रतिबद्धता सूचीबद्ध नहीं की जा सकती है।
  • मुझे ऊपर की स्क्रीनशॉट में 'शाखा रेखाएं' भी दिखाई देनी चाहिए। इन्हें शायद पूर्वकंपूर्ण होने की आवश्यकता है क्योंकि उनमें से अधिकतर अपने बच्चों पर निर्भर करते हैं।

कुछ टिप्पणी:

  • यह प्रतिबद्ध की एक सूची स्थानांतरित करने के लिए आवश्यक है। उदाहरण के लिए, हमें ऐसा करना पड़ सकता है (शाखा प्रमुख) जो असंबद्ध हैं, जब तक एक प्रतिबद्धता दिखाई न दे, जिससे एक सिर दूसरे के पूर्वजों को बना देता है।
  • एकाधिक शाखा युक्तियाँ
  • यह महत्वपूर्ण है कि यह प्रक्रिया बढ़ती जा रही है, ताकि कम से कम आंशिक दृश्य उपलब्ध हो, जबकि डेटा अभी भी लोड हो रहा है। इसका मतलब है कि नए डेटा को आधा रास्ते डालना होगा और शाखा लाइनों को समायोजित करना होगा।

उत्तर

6

मानक topological sort ओ (एन) (ओके, ओ (वी + ई)) है, यानी आप एक सेकंड के अंश में स्मृति में दस लाख काम करने में सक्षम होना चाहिए। टीसीएल में उन लोगों की तरह कोई वृद्धिशील हैक की आवश्यकता नहीं है।

Btw, मैं का उपयोग GitX हर रोज (बहुत ओएस एक्स पर Gitk की तुलना में बेहतर लग रहा है) और इसके साथ किसी भी मुद्दे नहीं है :)

+1

यह संभव हो सकता है, मैं इसे देख लूंगा। मुझे लगता है कि ग्राफ लाइनों की गणना करना अधिक महंगा है, जिसे मैं अब कैश करता हूं। उन पंक्तियों की गणना में कुछ समय लगता है (~ 1kcond 100k commits के लिए), इसलिए मैं हर बार फिर से गणना नहीं कर पाऊंगा। मुझे इसके लिए अभी भी कुछ वृद्धिशील अद्यतन की आवश्यकता होगी। – Pieter

-2

मैं GitX उपयोग नहीं किया है, तो शायद मैं कुछ याद कर रहा हूँ, लेकिन ऐसा लगता है जैसे आप वापस बच्चे से माता-पिता (रों) करने के लिए प्रत्येक वर्तमान शाखा के प्रमुख से जब तक आप कुछ स्क्रीन आकर्षित कर सकते हैं चल सका ग्राफ का

यह आपको उन शाखाओं का इष्टतम दृश्य लेआउट नहीं दे सकता है जो पहले जड़ें हैं। लेकिन ऐसा लगता है कि कम से कम क्रॉसिंग के साथ ग्राफ खींचने की प्रतीक्षा करने से प्रतिक्रिया अधिक महत्वपूर्ण होगी, क्योंकि अधिकांश उपयोगकर्ताओं को हाल की गतिविधि में दिलचस्पी होने की संभावना है।

+0

हां, आप मूल प्रक्रिया का वर्णन करते हैं जो मैं करना चाहता हूं, लेकिन मेरे प्रश्न का उत्तर न दें, यह कैसे करें और इसे कुशलता से कैसे करें :)। डीएजी चलना सिर्फ उन चीजों में से एक है जो आपको करना है, अगर आप इसे रैखिक बनाना चाहते हैं तो आपको उदाहरण के लिए कुछ स्थानान्तरण भी करना होगा। – Pieter

+0

मुझे लगता है कि बाएं से दाएं ऑर्डर का निर्णय लेने के लिए सबसे हालिया कामों, शायद अंतिम 200 को संसाधित करने में सक्षम है कि शाखाओं को एक पृष्ठ पर खींचा जाता है जो 25 काम करता है। इससे समस्या 6-10 मामलों में आसान हो जाएगी। या पूरे रेपो को 'रैखिकरण' करने का एक और कारण है? – Paul

+0

हां, यह वास्तव में पूरे भंडार लेना चाहिए। मैं सभी तरह से नीचे स्क्रॉल करने में सक्षम होना चाहता हूं, इसे पगिन करना बस नहीं करेगा। इसके अलावा, यह वर्तमान में पहले से ही सभी काम करता है। मैं इस पर कार्यक्षमता खोना नहीं चाहता। – Pieter

3

(शायद क्योंकि मैं अपने खजाने में उन पागल का आपस में विलय नहीं है) ठीक है, तो मुझे उस पैच की पूरी तरह से पढ़ने में एक कठिन समय है, लेकिन चलो देखते हैं कि मैं इसे एक साथ टुकड़ा कर सकता हूं जो मैंने पाया था।

प्रारंभ करने के लिए, गिटक एक चाप में काम करने की एक स्ट्रिंग को नियंत्रित करके चीजों को सरल बनाता है, जिसमें प्रत्येक चीज में केवल एक माता-पिता और एक बच्चा होता है। किसी और चीज के अलावा, ऐसा करने से आपको नाट्स की संख्या पर बहुत नाटकीय रूप से कटौती करनी चाहिए, जिसे आप अपने प्रकार के लिए विचार करना चाहते हैं, जो आपके द्वारा उपयोग किए जाने वाले एल्गोरिदम की मदद करेगा। बोनस के रूप में, संबंधित समितियां एक साथ समूहबद्ध हो जाएंगी।

यह एक नई प्रतिबद्धता पढ़ने पर एक चाप खोजने के मामले में कुछ जटिलता पेश करता है। कुछ स्थितियां हैं:

  • नई प्रतिबद्धता में एक अकेला माता पिता है, या कोई माता-पिता नहीं है। यह एक (संभवतः खाली) चाप फैलता है। अधिकांश समय, आप बस सबसे हालिया चाप का विस्तार करेंगे। कुछ रोचक सबकेस हैं:
    • यह मौजूदा चाप को विभाजित करने का कारण बन सकता है, अगर उसके माता-पिता के पास पहले से ही एक बच्चा है (यानी उसका माता-पिता एक शाखा बिंदु बन जाता है, जिसे मैं इकट्ठा करता हूं, आप आगे नहीं जानते समय की)।
    • यह एक "गायब लिंक" हो सकता है जो दो आर्कों को एक साथ जोड़ता है।
    • आप पहले से ही पता हो सकता है कि इस के लिए प्रतिबद्ध कई बच्चों
  • नई प्रतिबद्ध कई माता-पिता (किसी मर्ज के लिए प्रतिबद्ध है) है।

आप आर्क में बहु-बच्चे या बहु-अभिभावक काम करना शामिल कर सकते हैं, या इससे उन्हें अलग रखने के लिए और अधिक समझ हो सकती है। किसी भी तरह से, यह arcs के इस सेट को बढ़ाने के लिए बहुत मुश्किल नहीं होना चाहिए।

एक बार जब आपके पास ये arcs हो, तो आप अभी भी उन्हें रैखिक बनाने की कोशिश कर रहे हैं। आपके मामले में, उपरोक्त Wikipedia page पर वर्णित पहला एल्गोरिदम उपयोगी लगता है, क्योंकि आपके पास प्रारंभिक सेट एस के रूप में उपयोग करने के लिए शाखा बिंदुओं का एक ज्ञात सेट है।

अन्य नोट:

  • स्थानांतरित करता प्रबंधनीय होना चाहिए। सबसे पहले, आपको केवल दो arcs कनेक्ट करते समय, एक नए विलय प्रतिबद्धता, एक नव-खोजी शाखा बिंदु, या दो आर्कों को एक में जोड़ते समय केवल देखभाल करना होगा। कोई भी दिया गया चाप आसानी से अपनी वर्तमान पंक्ति संख्या सीमा को बनाए रख सकता है (माना जाता है कि आप अनुक्रमिक पंक्तियों पर एक चाप डालने के साथ ठीक हैं), इसलिए पेड़ की जांच करने के लिए सभी नए पूर्वजों को बाद में दिखाया जाना चाहिए।
  • मुझे ग्राफ लाइनों को चित्रित करने के बारे में ज्यादा कुछ नहीं कहना है, लेकिन मुझे लगता है कि यह अब आप जो भी करते हैं उससे अलग नहीं होगा।

वैसे भी, मुझे उम्मीद है कि इससे मदद मिलती है। कम से कम, इसके बारे में सोचना दिलचस्प था।

0

क्या आपको वास्तव में एक बार में 100k काम प्रदर्शित करने की आवश्यकता है? किस तरह का उपयोगकर्ता उस तरह की जानकारी को भंग कर सकता है?

क्या आपने पेजिंग के बारे में सोचा है? मैं सिर्फ ~ 100 प्रतिबद्धता या कुछ के लिए गणना करता हूं। यदि कोई शाखा-रेखा वापस (ऑफ-पेज) जाती है, तो आप इसे दिखाने के लिए गिथब के बैक-पॉइंटिंग तीर जैसे कुछ का उपयोग कर सकते हैं।

+1

हां, वर्तमान प्रणाली बहुत अच्छी तरह से काम करती है और उदाहरण के लिए, आपको तुरंत एक विशिष्ट तिथि तक स्क्रॉल करने की अनुमति देती है। पेजिंग का उपयोग करना सिर्फ कठिन और परेशान है। इसके अलावा, मैं एक कम सक्षम प्रणाली (पेजिंग) पर वापस नहीं जा रहा हूं। अगर मुझे वर्तमान में एक अच्छा समाधान नहीं मिल रहा है, तो मैं बस उस पर चिपके रहूंगा। – Pieter