2011-11-06 7 views
5

मैं .NET में एक प्रोजेक्ट विकसित कर रहा हूं, जिसमें से एक हिस्सा मैं श्रृंखला श्रृंखला में हेरफेर कर रहा हूं।कार्यात्मक प्रोग्रामिंग (एफ #) का उपयोग कर समय श्रृंखला कार्यान्वयन की सिफारिश की है?

चूंकि परियोजना का मुख्य भाग सी # में लागू किया गया है, इसलिए मैंने ऑब्जेक्ट-ओरिएंटेड डिज़ाइन को SortedDictionary<DateTime,T> से विरासत में मिलाया है।

हालांकि, मुझे पिछले कुछ सालों से कार्यात्मक प्रोग्रामिंग से प्यार हो रहा है, और मुझे लगा कि चूंकि यह घटक सुंदर जंगली और गहन एल्गोरिदम के अधीन होगा, इसलिए मैं इसे समानांतर में संसाधित करने के इच्छुक हूं, और मैं एक अपरिवर्तनीय संरचना का आनंद लेंगे।

मैं एक प्रकार को परिभाषित करने के रूप में इस का उपयोग करते हुए एफ # में यह डिजाइन करने के बारे में सोचा:

type TimeSeries<'t> = (DateTime * 't) seq 

और इसके साथ चल रहा है।

यह अपरिवर्तनीय होने का लाभ होगा, और समानांतर में निष्पादन F # के Async मॉड्यूल का उपयोग करके बहुत सरल होगा। मैं एफ # की माप सुविधा की इकाई का भी उपयोग कर सकता हूं।

मैं सी # में गणनाओं के परिणामों का उपयोग करने के लिए थोड़ा डर रहा हूं, और मुझे आश्चर्य हुआ कि अगर कोई पहले से प्रयास कर रहा है तो मुझे परिणाम में परिणाम के बारे में कुछ प्रतिक्रिया दे सकती है।

क्या अंत में उपयोग करना आसान था या सी # से एफ # में स्विच करना बहुत जटिल था?

यह तथ्य नहीं है कि संग्रह श्रृंखला बड़ी होने पर एक दक्षता समस्या अपरिवर्तनीय है?

क्या मैं तत्वों को विभाजित करने का प्रयास करने पर सामान्य प्रकार को सामान्य रखने में सक्षम हूं, या क्या मुझे अपने कार्यों के साथ TimeSeries<float> पर स्विच करना होगा?

यदि मैं कुछ सुविधाओं के लिए समय श्रृंखला पर सी # आधारित एल्गोरिदम का उपयोग करना चाहता हूं, तो क्या यह पूरा विचार बेकार हो जाएगा?

क्या आपको समय श्रृंखला के कार्यात्मक कार्यान्वयन की दक्षता पर किए गए शोध का कुछ संदर्भ मिला है?

+0

हाय, क्या आप इस प्रश्न पर अपडेट कर सकते हैं? मुझे यह तय करने की एक ही समस्या है कि कौन सा कार्यान्वयन सबसे अच्छा होगा। मैं जहां संभव हो Iobervables 'वास्तविक समय' अपडेट का उपयोग करने की योजना बना रहा हूं। – nicolas

उत्तर

8

यह अपरिवर्तनीय होने का लाभ होगा, और समानांतर में निष्पादन F # के Async मॉड्यूल का उपयोग करके बहुत सरल होगा।

इसके विपरीत, seq धीमी और स्वाभाविक रूप से धारावाहिक हैं। SortedDictionary का शाब्दिक एफ # समतुल्य Map है लेकिन इसका समानांतरता के लिए कोई समर्थन नहीं है। Async मॉड्यूल एसिंक्रोनस समवर्ती प्रोग्रामिंग के लिए अच्छा है लेकिन समांतरता के लिए बुरा है।

मान लीजिए कि आप समय के साथ तेजी से खोज करना चाहते हैं और क्रमशः पुन: प्रयास करना चाहते हैं लेकिन वृद्धिशील प्रविष्टि/हटाना नहीं है, तो आप KeyValuePair<DateTime, 'T> की एक क्रमबद्ध सरणी चाहते हैं क्योंकि यह उत्कृष्ट इलाके प्रदान करता है और इसलिए, समांतर एल्गोरिदम के लिए कैश जटिलता प्रदान करता है। ध्यान दें कि यदि आप उन्हें म्यूट करने से बचते हैं तो सरणी पूरी तरह कार्यात्मक हो सकती हैं। सावधान रहें कि F # 2 DateTime से अधिक विशेष ऑपरेशन (जैसे तुलना) टाइप नहीं करता है, इसलिए आपको उन्हें मैन्युअल रूप से कॉल करने की आवश्यकता होगी।

इस बात का मुहावरेदार विशुद्ध रूप से कार्यात्मक समकक्ष एक संतुलित खोज पेड़ समय से विभाजित होगा:

type TimeSeries<'a> = 
    | Leaf of DateTime * 'a 
    | Branch of TimeSeries<'a> * DateTime * TimeSeries<'a> 

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

यह तथ्य नहीं है कि समय श्रृंखला बड़ी होने पर संग्रह एक दक्षता समस्या अपरिवर्तनीय है?

पूरी तरह से निर्भर करता है कि आप इसके साथ क्या करना चाहते हैं।

क्या आपको समय श्रृंखला के कार्यात्मक कार्यान्वयन की दक्षता पर किए गए शोध का कुछ संदर्भ मिला है?

आपने एल्गोरिदम के बारे में कुछ भी नहीं कहा है जिसे आप लागू करना चाहते हैं या यहां तक ​​कि जिन परिचालनों को आप तेजी से करना चाहते हैं, इसलिए एक उपयोगी तरीके से मापा प्रदर्शन के बारे में बात करना मुश्किल है। मेरी नेटबुक पर एक त्वरित बेंचमार्क चलाकर, एक शब्दकोश में 1,000,000 बाइंडिंग डालने से पता चलता है कि म्यूटेबल SortedDictionary 5.2 लेता है और अपरिवर्तनीय Map 11.8 लेता है, इसलिए एक महत्वपूर्ण लेकिन बड़ा अंतर नहीं है। समकक्ष सरणी का निर्माण केवल 0.027 लेता है। Iterating क्रमशः 0.38s, 0.20s और 0.01s लेता है।

मैं सी # में गणनाओं के परिणामों का उपयोग करने के लिए थोड़ा डर रहा हूं, और मुझे आश्चर्य हुआ कि अगर कोई पहले से प्रयास कर रहा है तो मुझे परिणाम में परिणाम के बारे में कुछ प्रतिक्रिया दे सकती है।

बस अपने एफ # कोड से मानक .NET इंटरफ़ेस का खुलासा करें और यह आसान है।

+0

जॉन, मैं छवि दूंगा कि टाइम्सरीज़ का मुख्य अनुप्रयोग चल रहे आंकड़ों (माध्य/std/etc) की गणना कर रहा है और विंडो रिग्रेशन चला रहा है। बिल्डिंग समय इतना महत्वपूर्ण नहीं है। एक और मामला यह है कि जब यह वास्तविक समय में नया डेटा लेता है और एक परिपत्र बफर की तरह एक निश्चित अधिकतम लंबाई रखता है। – matlabdbuser

+0

@matlabdbuser: हाँ, बिल्कुल।मैंने हाल ही में एक प्रोजेक्ट भी किया था जो ज्यादातर मूल्यों में अनुक्रमिक रूप से आ रहा था, लेकिन कभी-कभी "फिक्स-अप" भी पुराने समय के साथ आ रहा था जो आंकड़ों के बीच में कहीं भी था। इन विभिन्न मामलों के लिए सबसे अच्छा डेटा प्रस्तुतिकरण बिल्कुल अलग है। तो यह जानना आवश्यक है कि ओपी किससे निपटने की अपेक्षा करता है। –

+0

उत्कृष्ट उत्तर लोग। धन्यवाद – SRKX

2
कुछ बिंदुओं

गौर करने योग्य

  • मामले में आप सी # (या अन्य CLR भाषा) करने के लिए एक एफ # घटक एपीआई का पर्दाफाश करना चाहते हैं तो आप के एफ # सार्वजनिक एपीआई में बीसीएल (या OO प्रकार) का उपयोग करना चाहिए घटक। अन्यथा आपको उन सभी प्रकारों को समझने की आवश्यकता होगी जो F # कोर लाइब्रेरी का उपयोग F # के कार्यात्मक अनुभव को लागू करने के लिए करता है। उदाहरण के लिए: FsharFunc
  • समानांतर प्रसंस्करण (रीड ओनली) अपरिवर्तनीय डेटा संरचना के लिए अच्छा है के रूप में आप यह सुनिश्चित करें कि कोई भी परदे के पीछे से डेटा को संशोधित कर रहे हैं और इसलिए आप आदि
  • अपरिवर्तनीय डेटा संरचना ताला लगा क्या करने की जरूरत नहीं है जब आप कहें कि एक आइटम को किसी सूची के अंत में जोड़ना है, तो "अच्छा" अच्छा नहीं हो सकता है, जो सैद्धांतिक रूप से अपरिवर्तनीय डेटा के मामले में नई सूची के साथ पूरी सूची की प्रतिलिपि बनायेगा। यह आमतौर पर clojure में Persistent data structure की तरह अडिग डेटा संरचनाओं में से कुछ चतुर कार्यान्वयन से बचा जाता है, जो एफ # (अभी तक)

मुझे आशा है कि ऊपर अंक तय करने के लिए क्या सबसे अच्छा अपने विशिष्ट कार्यान्वयन फिट में मदद करता है में नहीं हैं।

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