2015-06-24 27 views
5

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.

Odpowiedz

6

Zmiana limitu stosu przez OCAMLRUNPARAM działa tylko dla plików wykonywalnych kodu bajtowego, które są uruchamiane przez interpreter OCaml. Natywny program jest obsługiwany przez system operacyjny i wykonywany bezpośrednio na procesorze. Dlatego, aby zmienić limit stosu, musisz skorzystać z udogodnień udostępnianych przez twój system operacyjny.

Na przykład w systemie Linux znajduje się polecenie ulimit, które obsługuje wiele parametrów procesu, w tym limit stosu. Dodaj do skryptu:

ulimit -s $1 

Zobaczysz, że wynik się zmienia.

Powiązane problemy