haskell - Memory exploding upon writing a lazy bytestring to file in ghci -


निम्नलिखित प्रोग्राम नहीं विस्फोट करता है जब निष्पादन योग्य ( ghc -O0 विस्फोट के माध्यम से संकलित किया जाता है .एचएस ) चलाया जाता है, लेकिन जब ghci में चलने में करता है विस्फोट करता है ( ghci explode.hs या ghci -fobject-code Explode.hs ):

  - Explode.hs - साथ विस्फोट नहीं होता: ghc -O0 एक्सप्लोड एच एस - के साथ एक्सप्लोड: ghci Explode.hs - साथ एक्सप्लोड: ghci - एफओबीएक्स-कोड Explode.hs मॉड्यूल मुख्य (मुख्य) जहां आयात डेटा। आयात योग्य डाटा आयात करते हैं। बायट्रेडिंग। एलएल आयात योग्य डेटा के रूप में एलएजी। ब्इटेस्ट्रिंग.लाज़ी। सीएचआरएल के रूप में बीएलसी बनाओ एसआरआर :: इंट 64 - & gt; स्ट्रिंग - & gt; BL.ByteString createStr num str = BL.take num $ BL.cycle $ BLC.pack str मुख्य = do BLC.writeFile "results.txt" $ createStr 100000000 "abc \ n"  

क्यों यह ghci में विस्फोट हो जाता है और ghc -O0 Explode.hs के साथ नहीं है, और मैं कैसे इसे ghci में विस्फोट से रोक सकता है? मैं जिस तरीके से अपनाया था, वह यहां काम करने में नहीं लग रहा है writeFile कोड का निरीक्षण करने के बाद, ऐसा लगता है कि यह निर्भर करता है कि लिखें

hPut पर फ़ंक्शन का Data.ByteString.Lazy :

  - | निर्दिष्ट 'हैंडल' के लिए एक 'बाइट स्ट्रिंग' आउटपुट करता है - एचपीट :: हैंडल - & gt; बाइटस्ट्रिंग - & gt; IO () hPut h cs = foldrChunks (\ c बाकी - & gt; एस। एचपीट एचसी & gt; & gt; बाकी) (वापसी ()) सीएस  

hPut IO क्रिया का निर्माण करता है जो आलसी द्वारा टेस्टिगिंग को छानने के साथ-साथ एक प्रकार का सही गुना जोड़ देगा। foldrChunks फ़ंक्शन के लिए स्रोत है:

  - | स्वाभाविक दाहिने गुना के साथ एक आलसी बाइट स्ट्रिंग के भाग को खाएं। FoldrChunks :: (S.ByteString - & gt; एक - & gt; एक) - & gt; ए - & gt; बाइटस्ट्रिंग - & gt; एक foldrChunks fz = जाने कहाँ जाओ खाली = z जाना (चक सी सीएस) = एफसी (सी सी)  

कोड को देखकर, ऐसा लगता है जैसे आलसी बायटेस्टिंग का "रीढ़" (लेकिन प्रत्येक खंड में वास्तविक डेटा नहीं) पहले बाइट लिखने से पहले मजबूर हो जाएगा, क्योंकि (& gt; & gt;) IO monad के लिए कैसे व्यवहार करता है।

आपके उदाहरण में, आपके आलसी बायटेस्टिंग की रचना करने वाली सख्त खंड बहुत छोटी हैं। इसका मतलब यह है कि उनमें से एक बहुत कुछ उत्पन्न होगा जब foldrChunks 100000000 वर्ण लंबे आलु बेथेटिंग का "रीढ़ की हड्डी" को बल देता है।

यदि यह विश्लेषण सही है, तो संख्या उन्हें बड़ा बनाकर सख्त खंड स्मृति उपयोग को कम करेगा createStr के इस प्रकार से बड़ा खंड बनाता है जो मुझे घिसी में नहीं उड़ा देता है:

  createStr :: int64 - & gt; स्ट्रिंग - & gt; BL.ByteString createStr num str = BL.take num $ BL.cycle $ BLC.pack $ concat $ प्रतिलिपि 1000 $ str  

(मुझे यकीन नहीं है कि संकलित उदाहरण क्यों नहीं है उड़ो।)


Comments

Popular posts from this blog

java - org.apache.http.ProtocolException: Target host is not specified -

java - Gradle dependencies: compile project by relative path -

ruby on rails - Object doesn't support #inspect when used with .include -