2010-09-22 11 views
10

मैं ghci का उपयोग कर अपने कोड डीबग करने के लिए प्रयोग किया जाता है। अक्सर, कुछ इस तरह (ताकि स्पष्ट नहीं, निश्चित रूप से) होता है:क्या स्मृति को सीमित करने का कोई तरीका है, ghci हो सकता है?

ghci> let [email protected](_:x) = 0:1:zipWith(+)f x 
ghci> length f 

फिर, कुछ भी नहीं है कुछ समय के लिए होता है, और अगर मैं काफी तेजी से प्रतिक्रिया नहीं करते, GHCi शायद रैम 2 जीबी खाया है, जिससे मेरा सिस्टम जमा करने के लिए। यदि यह बहुत देर हो चुकी है, तो इस समस्या को हल करने का एकमात्र तरीका [ALT] + [PRINT] + [K] है।

मेरा प्रश्न: क्या स्मृति को सीमित करने का कोई आसान तरीका है, जिसे ghci द्वारा उपभोग किया जा सकता है, आइए 1 जीबी कहें? यदि सीमा पार हो गई है, तो गणना को निरस्त किया जाना चाहिए या ghci को मारा जाना चाहिए।

+1

भी देखें http://stackoverflow.com/questions/5716216/recovering-from-stack-overflow-or-heap-exhaustion-in-a-haskell -प्रोग्राम –

उत्तर

15

यह पूरा करने के लिए एक मंच स्वतंत्र तरीका की तरह इस

ghci +RTS -M1m 

जानकारी के लिए the GHC documentation’s page on how to control the RTS (runtime system) देख हास्केल क्रम करने के लिए विकल्प के रूप में -M विकल्प आपूर्ति है।

ghci उत्पादन अब लगता है कि:

>ghci +RTS -M10m 
GHCi, version 6.12.3: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Loading package ffi-1.0 ... linking ... done. 
Prelude> let [email protected](_:x) = 0:1:zipWith(+)f x 
Prelude> length f 
Heap exhausted; 
Current maximum heap size is 10485760 bytes (10 MB); 
use `+RTS -M<size>' to increase it. 
+3

मैंने अभी ''/.bashrc' में एक उपनाम 'alias ghci =' ghci + RTS-M500m -RTS'' बनाया है और अब कुछ भी ठीक है। आपका बहुत बहुत धन्यवाद। – fuz

+1

मुझे लगता है कि आप अपनी '.ghci' फ़ाइल का भी उपयोग कर सकते हैं? http://www.haskell.org/ghc/docs/7.2.1/html/users_guide/ghci-dot-files.html – MatrixFrog

+0

असल में यह सीमा समाप्त होने पर निरस्त नहीं होती है, इसलिए यह समाधान नहीं है। इसके अलावा ghci अभी भी कहा गया से अधिक स्मृति का उपयोग करता रहता है। उदाहरण के लिए मेरे पास '4 जीबी रैम है, मैंने इसे '-M100m' पर सेट किया है। यह मुझे बताता है कि यह '100 एमबी' पर सेट है, जो पूरी तरह ठीक है, लेकिन जब मैं' फाइब 100000 'चलाता हूं तो प्रोग्राम अभी भी मेरी मशीन को फ्रीज करता है।यह इसे पहले की तरह पूरी तरह से फ्रीज नहीं करता है, लेकिन स्मृति लगभग पूर्ण है और स्वैप भर रहा है, जिससे आईओ बहुत सारे हो जाते हैं, जिससे प्रणाली दो या दो मिनट के लिए अनुपयोगी हो जाती है। – Zelphir

2

ulimit -m सेट के साथ एक खोल के नीचे इसे चलाने का एक आसान तरीका है। यदि आप नियमित आधार पर कुछ सीमा के साथ चलना चाहते हैं, तो आप ghci चलाने से पहले एक रैपर स्क्रिप्ट बना सकते हैं जो ulimit करता है।

+0

यह काम नहीं करता है। मैंने कुछ 'ulimit -m 102400' की तरह कोशिश की और यह अभी भी स्मृति का उपभोग करता है। – fuz

+0

@ हॉब्स @FUZxxl आपको 'ulimit -v' का उपयोग करना चाहिए, न कि' ulimit -m'। '-m' स्विच भौतिक स्मृति को सीमित करता है, जबकि आपको वर्चुअल को सीमित करने की आवश्यकता होती है: भौतिक + स्वैप। मैं 'ulimit -v $ (((1024 ** 2) * 2) का उपयोग करता हूं) 4 जीबी रैम + 5 जीबीबी स्वैप के साथ' (zsh) और यह सिस्टम को जमा नहीं करता है। यह स्मृति की मात्रा को 2 जीबी तक सीमित करता है और इसे ~ ~/.zshrc' या '~/.bashrc' में रखा जा सकता है। – ZyX

+0

धन्यवाद। मुझे यह कम सहायक लगता है, क्योंकि मैं बाद में खोल में मान नहीं बदल सकता। (केवल नीचे ...) – fuz

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

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