2012-01-31 9 views
7

मैं अपने पहले "वास्तविक" हास्केल प्रोजेक्ट के रूप में एक सी # ऐप को हास्केल में परिवर्तित करने पर विचार कर रहा हूं। हालांकि मैं यह सुनिश्चित करना चाहता हूं कि यह एक परियोजना है जो समझ में आता है। ऐप ~ 15 धारावाहिक धाराओं से डेटा पैकेट एकत्र करता है जो लगभग 1 किलोहर्ट्ज पर आते हैं, उन मानों को मेरे "संदर्भ" ऑब्जेक्ट पर संबंधित सर्कुलर बफर में लोड करते हैं, प्रत्येक ~ 25000 तत्वों के साथ, और फिर 60 हर्ट्ज पर उन सरणी को ओपनजीएल में भेजता है तरंग प्रदर्शन। (इस प्रकार में एक सरणी के रूप में संग्रहीत किया जा सकता है, या कम से कम प्रत्येक 16 एमएस में सरणी में परिवर्तित किया जाता है)। मेरे संदर्भ ऑब्जेक्ट पर लगभग 70 फ़ील्ड भी हैं जो मैं केवल वर्तमान (नवीनतम) मान को बनाए रखता हूं, न कि स्ट्रीम वेवफ़ॉर्म।क्या हास्केल में स्ट्रीम रिकॉर्डिंग के लिए तेज़ बड़े गोलाकार बफर सरणी बनाना संभव है?

इस परियोजना के कई पहलू हैं जो हास्केल को अच्छी तरह से मैप करते हैं, लेकिन जिस चीज के बारे में मुझे चिंता है वह प्रदर्शन है। यदि किसी भी स्ट्रीम में प्रत्येक नए डेटापॉइंट के लिए, मुझे पूरे संदर्भ वस्तु को 70 फ़ील्ड और 15 25000-तत्व सरणी के साथ क्लोन करना है, जाहिर है कि प्रदर्शन के मुद्दे होने जा रहे हैं।

क्या मैं आईओ-मोनड में सबकुछ डालकर इसे प्राप्त करूंगा? लेकिन फिर ऐसा लगता है कि हास्केल का उपयोग करने के उद्देश्य को कुछ हद तक हराया गया है, है ना? इसके अलावा सी # में मेरा सभी कोड घटना संचालित है; क्या हास्केल में उसके लिए एक मुहावरे है? ऐसा लगता है कि श्रोता जोड़ने से "साइड इफेक्ट" बन जाता है और मुझे यकीन नहीं है कि यह वास्तव में कैसे किया जाएगा।

उत्तर

5

हां, आप शायद उत्परिवर्तनीय डेटा के लिए आईओ मोनैड का उपयोग करना चाहते हैं। मुझे विश्वास नहीं है कि एसटी मोनड इस समस्या स्थान के लिए एक अच्छा फिट है क्योंकि डेटा अपडेट वास्तविक आईओ क्रियाओं (इनपुट स्ट्रीम पढ़ने) के साथ interleaved हैं। जैसा कि आपको unsafeIOToST का उपयोग करके एसटी के भीतर आईओ निष्पादित करने की आवश्यकता होगी, मुझे लगता है कि मैं केवल आईओ का उपयोग करना बेहतर करता हूं।एसटी के साथ दूसरा दृष्टिकोण लगातार एक सरणी को ठंडा करना और फ्रीज करना है; यह गन्दा है क्योंकि आपको यह गारंटी देने की आवश्यकता है कि डेटा की पुरानी प्रतियों का कभी भी उपयोग नहीं किया जाता है।

हालांकि evidence shows कि एक शुद्ध समाधान (Data.Sequence.Seq के रूप में) अक्सर परिवर्तनशील डेटा का उपयोग कर की तुलना में तेजी है, आपकी आवश्यकता है कि डेटा जा ओपन करने के लिए बाहर धक्का दे दिया दिया, आप संभव बेहतर प्रदर्शन सरणी सीधे साथ काम करने से मिल जाएगा। मैं Data.Vector.Storable.Mutable (वेक्टर पैकेज से) के कार्यों का उपयोग करता हूं, तब तक आपके पास निर्यात के लिए ForeignPtr तक पहुंच है।

आप घटना-संचालित कोड के लिए एक बहुत ही आम दृष्टिकोण के लिए तीर (Yampa) देख सकते हैं। एक और क्षेत्र कार्यात्मक प्रतिक्रियाशीलता (एफआरपी) है। नेटवायर या प्रतिक्रियाशील-केले जैसे इस डोमेन में कुछ उचित परिपक्व पुस्तकालय होने शुरू हो रहे हैं। मुझे नहीं पता कि वे आपकी आवश्यकताओं के लिए पर्याप्त प्रदर्शन प्रदान करेंगे या नहीं; मैंने ज्यादातर उन्हें गुई-प्रकार प्रोग्रामिंग के लिए उपयोग किया है।

7
इस लिंक, अनुभाग "अनुसूचित जनजाति इकाई" के अंतर्गत पर

देखो:

http://book.realworldhaskell.org/read/advanced-library-design-building-a-bloom-filter.html

अनुभाग, हम उल्लेख "सरणी तत्वों को संशोधित करना" कहा जाता है में वापस अपरिवर्तनीय सरणी को संशोधित करने निषेधात्मक है कि महंगा, क्योंकि यह को संपूर्ण सरणी की प्रतिलिपि बनाने की आवश्यकता है। एक UArray का उपयोग को नहीं बदलता है, तो हम सहनशील स्तरों को कम करने के लिए क्या कर सकते हैं?

एक अनिवार्य भाषा में, हम बस सरणी के तत्वों को आसानी से संशोधित करेंगे; यह हास्केल में भी हमारा दृष्टिकोण होगा।

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

हम एक परिवर्तनीय सरणी देने के लिए एक अपरिवर्तनीय सरणी बना सकते हैं; म्यूटेबल सरणी को जगह में संशोधित करें; और किए जाने पर एक नया अपरिवर्तनीय सरणी जमा करें।

...

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

इसलिए जगह में संशोधित करना संभव होना चाहिए, और यह सब के बाद हास्केल का उपयोग करने के उद्देश्य को हराने नहीं देगा।

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