क्या शुद्ध डेटाफ़्लो शैली में "वृद्धिशील अद्यतन" कार्यों की रचना के लिए एक प्रतिमान है?


10

मैं इस प्रश्न को पूछने के लिए सही शब्दावली नहीं जानता, इसलिए मैं इसके बजाय बहुत सारे शब्दों के साथ इसका वर्णन करूंगा।

पृष्ठभूमि , बस इसलिए हम एक ही पृष्ठ पर हैं: प्रोग्राम में अक्सर कैश होते हैं - एक समय / मेमोरी ट्रेडऑफ़। एक सामान्य प्रोग्रामर की गलती यह है कि वह अपने अपस्ट्रीम स्रोतों / मिसालों में से एक को बदलने के बाद कैश्ड वैल्यू को अपडेट करना न भूलें। लेकिन डेटाफ्लो या एफआरपी प्रोग्रामिंग प्रतिमान ऐसी गलतियों के लिए प्रतिरक्षा है। यदि हमारे पास कई शुद्ध कार्य हैं, और उन्हें एक साथ निर्भर निर्भरता ग्राफ में जोड़ते हैं, तो नोड्स में उनके आउटपुट मूल्य को कैश किया जा सकता है और फ़ंक्शन के किसी भी इनपुट को बदलने तक फिर से उपयोग किया जा सकता है। यह सिस्टम आर्किटेक्चर पेपर कैशिंग इन डाटाफ्लो-आधारित वातावरण में वर्णित है और अनिवार्य भाषा में यह संस्मरण के अनुरूप कम या ज्यादा है।

समस्या : जब किसी फ़ंक्शन के इनपुट में से एक में परिवर्तन होता है, तो हमें अभी भी फ़ंक्शन को संपूर्ण रूप से निष्पादित करना होगा, इसके कैश्ड आउटपुट को फेंकना और स्क्रैच से पुनः गणना करना। कई मामलों में, यह मुझे बेकार लगता है। एक सरल उदाहरण पर विचार करें जो "शीर्ष 5 जो भी" सूची उत्पन्न करता है। इनपुट डेटा जो कुछ भी है उसकी एक अनसुलझी सूची है। यह एक फ़ंक्शन के इनपुट के रूप में पारित किया गया है जो एक क्रमबद्ध सूची को आउटपुट करता है। बदले में एक फ़ंक्शन के लिए इनपुट है जो केवल पहले 5 आइटम लेता है। छद्मकोड में:

input = [5, 20, 7, 2, 4, 9, 6, 13, 1, 45]
intermediate = sort(input)
final_output = substring(intermediate, 0, 5)

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

मेरे अंतर्ज्ञान से यह पता चलता है कि किसी भी तरह के "वृद्धिशील अद्यतन" फ़ंक्शन को डेटाफ़्लो सिस्टम में जोड़ना संभव हो सकता है, मौजूदा "खरोंच से" कार्यों के साथ-साथ। बेशक, खरोंच से सब कुछ फिर से गणना करना हमेशा वृद्धिशील अपडेट के एक झुंड के रूप में एक ही परिणाम देना चाहिए। सिस्टम में यह गुण होना चाहिए कि यदि प्रत्येक व्यक्ति आदिम FromScratch-Incremental जोड़े हमेशा एक ही परिणाम देते हैं, तो उनसे निर्मित बड़े समग्र कार्य भी स्वचालित रूप से एक ही परिणाम देना चाहिए।

प्रश्न : क्या यह संभव है कि एक प्रणाली / वास्तुकला / प्रतिमान / मेटा-एल्गोरिथ्म जो FromScratch कार्यों और उनके इंक्रीमेंटल समकक्षों दोनों का समर्थन कर सकता है, दक्षता के लिए सहयोग कर सकता है और बड़े प्रवाह में रचना कर सकता है? यदि नहीं, तो क्यों? यदि किसी ने इस प्रतिमान पर पहले से ही शोध कर लिया है और उसे प्रकाशित कर दिया है, तो उसे क्या कहा जाता है, और क्या मुझे इस बात का संक्षिप्त सारांश मिल सकता है कि यह कैसे काम करता है?


BTW, आपके उदाहरण के विशिष्ट मामले में, एक और भी अधिक कुशल समाधान ढेर का उपयोग करना होगा । किसी आइटम को सम्मिलित करना अब केवल , और शीर्ष मानों की अपडेट की गई क्रमबद्ध सूची बनाना अब केवल । k O ( k लॉग एन )O(logn)kO(klogn)
j_random_hacker

जवाबों:


7

इस क्षेत्र का आविष्कार कई बार हुआ है, और कई नामों से जाना जाता है, जैसे:

(और संभवतः अधिक।) वे समान नहीं हैं, लेकिन संबंधित हैं।

Paraphrasing Cai et al (1): ऑनलाइन एल्गोरिदम को उदारतापूर्वक लागू करने के दो मुख्य तरीके हैं (यानी किसी विशिष्ट एल्गोरिथम समस्या के संदर्भ के बिना):

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

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

इसके अलावा, कोई हमेशा दिए गए एल्गोरिथम के ऑनलाइन संस्करण के साथ 'हाथ से' कोशिश कर सकता है। यह मुश्किल हो सकता है।


(1) वाई। कै।, पी.जी. जियारुसो, टी। रेंडेल, के। ओस्टरमन, उच्चतर भाषाओं के लिए परिवर्तन का सिद्धांत: स्थैतिक विभेदीकरण द्वारा λ-Calculi को बढ़ाना


1

आप शायद अनुकूली प्रोग्रामिंग की तलाश कर रहे हैं । उमुट अकर की पीएचडी थीसिस भी देखें । मैं इस क्षेत्र के साथ अप-टू-डेट नहीं हूं लेकिन इसे आपको शुरू करना चाहिए, आप संदर्भों का पीछा कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.