को प्रभावित नहीं करता है, मैं अपने स्टैक आकार को बदलना चाहता हूं ताकि एक परियोजना को बड़े डेटा पर चलाने के लिए कई गैर-पूंछ-पुनरावर्ती कार्यों के साथ अनुमति दी जा सके। ऐसा करने के लिए, मैंने 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 शब्दों में।