如何在 Windows 中增加 Julia 的堆栈大小?

How to increase stack size for Julia in Windows?

我写了一个递归函数(基本上是洪水填充),它在较小的数据集上运行良好,但对于稍大的输入,它会抛出 WhosebugError

如何在 Windows 10 下增加 Julia 的堆栈大小?理想情况下,该解决方案应适用于 JupyterLab。

这是一个单独使用的程序,optimizing/rewriting 没有意义,我只需要在结果上达到顶峰而忘记代码。

更新: 作为测试用例,我提供以下 MWE。这只是一个简单的算法,通过n数组递归访问n的每个单元格:

n = 120

visited = fill(false, (n,n))

function visit_single_neighbour(i,j,Δi,Δj)
  if 1 ≤ i + Δi ≤ n && 1 ≤ j + Δj ≤ n
    if !visited[i+Δi, j+Δj]
      visited[i+Δi, j+Δj] = true
      visit_four_neighbours(i+Δi, j+Δj)
    end
  end
end

function visit_four_neighbours(i,j)
  visit_single_neighbour(i,j,1,0)
  visit_single_neighbour(i,j,0,1)
  visit_single_neighbour(i,j,-1,0)
  visit_single_neighbour(i,j,0,-1)
end

@time visit_four_neighbours(1,1)

对于 n = 120,输出是 0.003341 seconds,但对于 n = 121,它抛出 WhosebugError

在具有 ulimit -s unlimited 的 Linux 机器上,代码运行 n = 2000 没有问题,大约需要 2.4 秒。

我已将问题反映给 Julia Discource:https://discourse.julialang.org/t/ow-to-increase-stack-size-for-julia-in-windows/79932

你肯定知道 Julia 并没有针对递归进行优化,建议可能总是以某种方式重写代码。

话虽如此,当然有办法增加堆栈限制。从 julia 内部实现它的一种未记录的方法是在创建 Task:

时保留堆栈 space
Core.Task(f, reserved_stack::Int=0)

让我们创建一个包装这样一个任务的函数:

with_stack(f, n) = fetch(schedule(Task(f,n)))

对于 n = 2000 以下内容适用于 windows 和 linux(只要有足够的可用内存):

julia> with_stack(2_000_000_000) do
  visit_four_neighbours(1,1)
end