Chciałbym zmienić rozmiar stosu, aby umożliwić projektowi z wieloma nierekultywującymi funkcjami rekurencyjnymi do uruchamiania na większych danych. W tym celu próbowałem ustawić OCAMLRUNPARAM="l=xxx"
dla zmiennych wartości xxx (w zakresie od 0 do 10G), ale nie wywarło to żadnego efektu. Czy ustawienie OCAMLRUNPARAM jest odpowiednie?OCAMLRUNPARAM nie ma wpływu na wielkość stosu
W przypadku, gdy jest to istotne: Projekt, który mnie interesuje, jest zbudowany przy użyciu OCamlMakefile, target native-code
.
Oto minimalny przykład, w którym po prostu duża lista jest tworzona bez rekurencji ogona. Aby szybko sprawdzić, czy ustawienie OCAMLRUNPARAM ma wpływ, skompilowany program 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.")
używając polecenia
ocamlbuild stacktest.native
i okazało się, z grubsza, w którym długość listy przepełnienie stosu następuje przez (mniej lub bardziej) wyszukiwania binarnego z poniższego skryptu bash 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
wyniki zmianie między ciągami tego skryptu (i wyniki pośrednie nie są jeszcze spójne w obrębie jednego biegu, ale niech ignorować faktu, że do tej pory), ale są podobne bez względu na to, czy mogę zadzwonić
bash foo.sh 1
lub
bash foo.sh 1G
czyli czy rozmiar stosu jest ustawiony do 1 lub 2^30 słów.