gpt4 book ai didi

OCAMLRUNPARAM 不影响堆栈大小

转载 作者:行者123 更新时间:2023-12-04 18:05:02 25 4
gpt4 key购买 nike

我想更改我的堆栈大小以允许具有许多非尾递归函数的项目在更大的数据上运行。为此,我尝试设置 OCAMLRUNPARAM="l=xxx"对于 xxx 的不同值(在 0 到 10G 范围内),但它没有任何影响。设置 OCAMLRUNPARAM 甚至是正确的方法吗?

如果相关:我感兴趣的项目是使用 OCamlMakefile 构建的,目标 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

或者
bash foo.sh 1G

即堆栈大小是否设置为 1 或 2^30 个字。

最佳答案

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

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

ulimit -s $1

你会看到结果正在改变。

关于OCAMLRUNPARAM 不影响堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31028681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com