2015-06-24 6 views
5

को प्रभावित नहीं करता है, मैं अपने स्टैक आकार को बदलना चाहता हूं ताकि एक परियोजना को बड़े डेटा पर चलाने के लिए कई गैर-पूंछ-पुनरावर्ती कार्यों के साथ अनुमति दी जा सके। ऐसा करने के लिए, मैंने xxx के विभिन्न मानों के लिए OCAMLRUNPARAM="l=xxx" सेट करने की कोशिश की (श्रेणी 0 से 10 जी में), लेकिन इसका कोई प्रभाव नहीं पड़ा। OCAMLRUNPARAM को सही दृष्टिकोण भी स्थापित कर रहा है?OCAMLRUNPARAM स्टैक आकार

यदि यह प्रासंगिक है: जिस परियोजना में मुझे रूचि है, वह ओकैमलमेकफाइल का उपयोग करके बनाया गया है, लक्ष्य native-code

यहां एक न्यूनतम उदाहरण है जहां पूंछ रिकर्सन के बिना बस एक बड़ी सूची बनाई जाती है। जल्दी से जाँच करने के लिए OCAMLRUNPARAM की स्थापना एक प्रभाव पड़ता है कि क्या, मैं इस कार्यक्रम stacktest.ml संकलित:

let rec create l = 
    match l with 
| 0 -> [] 
| _ -> "00"::(create (l-1)) 

let l = create (int_of_string (Sys.argv.(1))) 
let _ = print_endline("List of size "^string_of_int (List.length l)^" created.") 

आदेश

ocamlbuild stacktest.native 

का उपयोग करने और बाहर मोटे तौर पर एक ढेर अतिप्रवाह सूची की जो लंबाई में से होता पाया (कम या ज्यादा) निम्नलिखित बैश स्क्रिप्ट foo.sh के साथ द्विआधारी खोज:

#!/bin/bash 
export OCAMLRUNPARAM="l=$1" 
increment=1000000 
length=1 
while [[ $increment > 0 ]] ; do 
    while [[ $(./stacktest.native $length) ]]; do 
     length=$(($length+$increment)) 
    done 
    length=$(($length-$increment)) 
    increment=$(($increment/2)) 
    length=$(($length+$increment)) 
done 
length=$(($length-$increment)) 
echo "Largest list without overflow: $length" 
echo $OCAMLRUNPARAM 

परिणाम इस स्क्रिप्ट का रन के बीच भिन्न हो (और मध्यवर्ती परिणाम एक रन के भीतर भी संगत नहीं हैं, लेकिन अब के लिए है कि ध्यान न दें) करते हैं, लेकिन वे समान हैं कोई फर्क नहीं पड़ता कि क्या मैं फोन

bash foo.sh 1 

या

bash foo.sh 1G 

ढेर आकार सेट कर दिया जाता यानी कि क्या 1 या 2^30 शब्दों में।

उत्तर

6

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

उदाहरण के लिए, लिनक्स पर ulimit कमांड है जो स्टैक सीमा सहित कई प्रक्रिया पैरामीटर को संभालता है। अपनी स्क्रिप्ट

ulimit -s $1 

और आप देखेंगे कि परिणाम बदल रहा है।

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