首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCAMLRUNPARAM不影响堆栈大小

OCAMLRUNPARAM不影响堆栈大小
EN

Stack Overflow用户
提问于 2015-06-24 13:59:55
回答 1查看 879关注 0票数 6

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

如果是相关的话:我感兴趣的项目是使用OCamlMakefile (目标native-code )构建的。

下面是一个很小的例子,其中简单地创建了一个没有尾递归的大列表。为了快速检查OCAMLRUNPARAM的设置是否有效,我编译了程序stacktest.ml

代码语言:javascript
复制
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.")

使用命令

代码语言:javascript
复制
ocamlbuild stacktest.native

并通过使用下面的bash脚本foo.sh (或多或少)二进制搜索,大致找出堆栈溢出的长度。

代码语言:javascript
复制
#!/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

这个脚本的运行结果是不同的(中间结果在一次运行中甚至不一致,但是现在我们忽略它),但是不管我是否调用它们,它们都是相似的。

代码语言:javascript
复制
bash foo.sh 1

代码语言:javascript
复制
bash foo.sh 1G

也就是说,堆栈大小是设置为1还是2^30字。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-24 14:52:30

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

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

代码语言:javascript
复制
ulimit -s $1

你会看到结果正在改变。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31028681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档