OCAMLRUNPARAM不影响堆栈大小

OCAMLRUNPARAM不影响堆栈大小,ocaml,stack-overflow,Ocaml,Stack Overflow,我想改变我的堆栈大小,以允许具有许多非尾部递归函数的项目在更大的数据上运行。为此,我尝试为xxx的不同值(在0到10G范围内)设置OCAMLRUNPARAM=“l=xxx”,但没有任何效果。设置OCAMLRUNPARAM是否是正确的方法 如果相关:我感兴趣的项目是使用OCamlMakefile构建的,targetnative code 下面是一个简单的示例,其中只创建了一个大列表,没有尾部递归。为了快速检查OCAMLRUNPARAM的设置是否有效,我编译了程序stacktest.ml: let

我想改变我的堆栈大小,以允许具有许多非尾部递归函数的项目在更大的数据上运行。为此,我尝试为xxx的不同值(在0到10G范围内)设置
OCAMLRUNPARAM=“l=xxx”
,但没有任何效果。设置OCAMLRUNPARAM是否是正确的方法

如果相关:我感兴趣的项目是使用OCamlMakefile构建的,target
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
并通过使用以下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
这个脚本的运行结果各不相同(中间结果在一次运行中甚至不一致,但现在我们忽略这一点),但无论我是否调用

bash foo.sh 1


i、 e.堆栈大小是设置为1还是2^30个字。

通过OCAMLRUNPARAM更改堆栈限制仅适用于由OCaml解释器运行的字节码可执行文件。本机程序由操作系统处理,并直接在CPU上执行。因此,为了更改堆栈限制,您需要使用操作系统提供的工具

例如,在Linux上有
ulimit
命令,它处理许多进程参数,包括堆栈限制。将以下内容添加到脚本中

ulimit -s $1
你会看到结果正在改变

ulimit -s $1