【发布时间】:2015-07-15 22:07:15
【问题描述】:
所以我正在尝试迭代某些东西的分区列表,比如1:n 用于 13 到 21 之间的一些 n。理想情况下,我想要运行的代码如下所示:
valid_num = @parallel (+) for p in partitions(1:n)
int(is_valid(p))
end
println(valid_num)
这将使用@parallel for 来减少我的问题。例如,将此与 Julia 文档中的示例进行比较:
nheads = @parallel (+) for i=1:200000000
Int(rand(Bool))
end
但是,如果我尝试调整循环,我会收到以下错误:
ERROR: `getindex` has no method matching getindex(::SetPartitions{UnitRange{Int64}}, ::Int64)
in anonymous at no file:1433
in anonymous at multi.jl:1279
in run_work_thunk at multi.jl:621
in run_work_thunk at multi.jl:630
in anonymous at task.jl:6
我认为这是因为我试图迭代不是1:n 形式的东西(编辑:我认为这是因为如果p=partitions(1:n),你不能调用p[3])。
我尝试使用pmap 来解决这个问题,但是因为分区的数量会变得非常大,非常快(1:13 的分区超过 250 万个,当我到达 1:21 时将是巨大的),构建如此大的数组成为一个问题。我让它运行了一夜,它仍然没有完成。
有人对我如何在 Julia 中有效地做到这一点有任何建议吗?我可以使用约 30 核计算机,而且我的任务似乎很容易并行化,所以如果有人知道在 Julia 中执行此操作的好方法,我将不胜感激。
非常感谢!
【问题讨论】:
-
我认为您可以将
for p in partitions(1:n)替换为for p in collect(partitions(1:n))。但是,根据您问题的大小,您可能会遇到内存问题......此外,我很惊讶您无法迭代partitions的输出,因为我认为这是 this issue here 处理的。尽管如此,索引到partitions的输出在我的机器上也不起作用,所以我显然遗漏了一些东西...... -
我希望可以。如果我尝试
for p in collect(partitions(1:21))),我知道我必须这样做,我会遇到内存问题:(