2012-05-27 9 views
8

में बास्केट गणना क्या बास्केट गणना करने के लिए हैस्केल में कोई तरीका है (यदि यह मायने रखता है तो जीएचसी का उपयोग करके, लिनक्स और विंडोज पर चलने वाले कोड के लिए)? यही है, "इस कार्य के परिणाम की गणना करें यदि ऐसा करने के लिए व्यवहार्य है, लेकिन यदि प्रयास ने एक्स सीपीयू चक्रों, वाई स्टैक स्पेस या जेड हीप स्पेस से अधिक उपयोग किया है, और अभी भी नहीं किया है, तो रोकें और संकेत दें कि यह गणना पूर्ण करने के लिए संभव नहीं था "?हास्केल

+0

क्या आप कुछ मॉडल जांच उपकरण बना रहे हैं? –

+0

अन्य चीजों के अलावा, हाँ। – rwallace

+0

यह भी रुचि का हो सकता है: http://hackage.haskell.org/package/speculation – jberryman

उत्तर

8
+0

धन्यवाद! यह निश्चित रूप से सीमित समय के उत्तर की तरह दिखता है। प्रलेखन के उस खंड के माध्यम से देख रहे हैं, स्मृति के लिए कोई समान समाधान प्रतीत नहीं होता है? वास्तव में – rwallace

+2

। मैं स्मृति के लिए किसी भी समझदार अर्थशास्त्र की कल्पना नहीं कर सकता, हालांकि - स्मृति खपत को मापने की अत्यधिक कठिनाई के अलावा, क्या होगा यदि कोई अन्य थ्रेड है जो स्मृति को बाधित नहीं करता है? क्या होगा यदि आप उस अन्य धागे के साथ कुछ मूल्य साझा करते हैं; कौन "इसके लिए भुगतान करता है"? चल रहे कार्यों को अपंग किए बिना माप प्राप्त करने के लिए आप उन मुद्दों को जल्दी से कैसे हल कर सकते हैं? –

+0

हाँ, ये कठिन समस्याएं हैं और ईमानदारी से मैं एक सामान्य उद्देश्य वाली भाषा की संभावना के बारे में आशावादी नहीं था, जो ऑफ-द-शेल्फ समाधान प्रदान करता है, लेकिन मुझे लगा कि यह अपने स्वयं के मेमोरी प्रबंधन आदि को हैक करने के लिए खुद को इस्तीफा देने से पहले एक कोशिश के लायक था। सी ++ में :-) – rwallace

6

यहाँ एक hackish समाधान है आप सकता है कोशिश: forkIO के साथ अपने गणना अंडे, और माता पिता धागा जाने (या एक निगरानी धागा जो की पहुंच है काँटेदार थ्रेड ThreadId) समय-समय के लिए मतदान कोई भी मात्रा जो आप चाहते हैं, और आवश्यकतानुसार कंप्यूटिंग थ्रेड के लिए एसिंक्रोनस अपवाद फेंक दें (दिलचस्प बात यह है कि यह वास्तव में timeout काम करता है।)

अगला प्रश्न यह होगा कि क्या यह पता लगाने का एक तरीका है कि वर्तमान में हेस्सेल के भीतर से ढेर कितना बड़ा है। कुल मेमोरी खपत और चक्र जो आप शेल कमांड को स्पॉन्ग करके खोज सकते हैं, या किसी अन्य तरीके से ओएस से पूछताछ कर सकते हैं (मुझे नहीं पता कि विंडोज पर ऐसा कैसे करें।)

यह एक सही समाधान नहीं है, लेकिन यह एक आसान है , जिसे आप कुछ मिनटों में कार्यान्वित और परीक्षण कर सकते हैं।

+0

मैं मेमोरी-इन-यूज विधि के लिए शिकार कर रहा था, लेकिन हास्केल के भीतर कोई नहीं मिला। –

+0

कांटा के ढेर के उपयोग की निगरानी करने के बजाय, आप 'आरटीएस' के साथ अपने ढेर को सीमित कर सकते हैं, है ना? – leftaroundabout

+0

'फोर्कियो' एक ही हास्केल प्रोग्राम के भीतर है। जब तक कि आप वास्तव में एक नई प्रक्रिया को जन्म नहीं दे रहे हैं, आप साझा ढेर के भीतर काम कर रहे हैं। –

6

प्रति-प्रक्रिया स्तर पर, आप अधिकतम स्टैक और ढेर आकारों को नियंत्रित करने के लिए GHC's RTS options का उपयोग कर सकते हैं।