2015-06-24 17 views
5

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ừ.

Trả lời

6

Thay đổi giới hạn ngăn xếp qua OCAMLRUNPARAM chỉ hoạt động đối với tệp thực thi bytecode, được chạy bởi trình thông dịch OCaml. Một chương trình gốc được xử lý bởi một hệ điều hành và được thực thi trực tiếp trên CPU. Vì vậy, để thay đổi giới hạn ngăn xếp, bạn cần phải sử dụng các cơ sở, được cung cấp bởi hệ điều hành của bạn.

Ví dụ: trên Linux có lệnh ulimit xử lý nhiều thông số quy trình, bao gồm giới hạn ngăn xếp. Thêm nội dung sau vào tập lệnh của bạn

ulimit -s $1 

Và bạn sẽ thấy kết quả đang thay đổi.

Các vấn đề liên quan