如何在 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
我写了一个递归函数(基本上是洪水填充),它在较小的数据集上运行良好,但对于稍大的输入,它会抛出 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
:
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