Tôi muốn thay đổi kích thước ngăn xếp của mình để cho phép dự án có nhiều chức năng không đệ quy để chạy trên dữ liệu lớn hơn. Để làm như vậy, tôi đã cố gắng đặt OCAMLRUNPARAM="l=xxx"
cho các giá trị khác nhau của xxx (trong phạm vi từ 0 đến 10G), nhưng nó không có bất kỳ ảnh hưởng nào. Có đặt OCAMLRUNPARAM ngay cả cách tiếp cận đúng không?OCAMLRUNPARAM không ảnh hưởng đến kích thước ngăn xếp
Trong trường hợp có liên quan: Dự án tôi quan tâm được xây dựng bằng OCamlMakefile, nhắm mục tiêu native-code
.
Dưới đây là một ví dụ tối thiểu mà chỉ đơn giản là một danh sách lớn được tạo mà không cần đệ quy đuôi. Để nhanh chóng kiểm tra xem các thiết lập của OCAMLRUNPARAM có tác dụng, tôi biên soạn chương trình 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.")
sử dụng lệnh
ocamlbuild stacktest.native
và phát hiện ra khoảng lúc đó chiều dài của danh sách một chồng tràn xảy ra bởi (nhiều hơn hoặc ít hơn) tìm kiếm nhị phân với tập lệnh bash sau đây 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
Kết quả khác nhau giữa các lần chạy tập lệnh này (và các kết quả trung gian thậm chí không phù hợp trong một lần chạy thử, nhưng chúng ta hãy bỏ qua cho bây giờ), nhưng họ cũng tương tự như bất kể tôi gọi
bash foo.sh 1
hoặc
bash foo.sh 1G
tức là dù kích thước ngăn xếp được thiết lập đến 1 hoặc 2^30 từ.