我想运行并行for循环.我需要每个进程都能访问2个大字典,gene_dict和transcript_dict.这是我先试过的 @everywhere( function EM ... end )generefs = [ @spawnat i genes for i in 2:nprocs()]dict1refs = [ @spawnat i gene_d
@everywhere( function EM ... end ) generefs = [ @spawnat i genes for i in 2:nprocs()] dict1refs = [ @spawnat i gene_dict for i in 2:nprocs()] dict2refs = [ @spawnat i transcript_dict for i in 2:nprocs()] result = @parallel (vcat) for i in 1:length(genes) EM(genes[i], gene_dict, transcript_dict) end
但我在所有进程(不仅仅是5)上得到以下错误:
exception on 5: ERROR: genes not defined in anonymous at no file:1514 in anonymous at multi.jl:1364 in anonymous at multi.jl:820 in run_work_thunk at multi.jl:593 in run_work_thunk at multi.jl:602 in anonymous at task.jl:6 UndefVarError(:genes)
我认为@spawnat会将我需要的三个数据结构移动到所有进程中.我的第一个想法是,这个移动需要一段时间,并行for循环尝试在数据传输完成之前运行.
数据由@spawnat移动,但它不绑定到与主节点上的名称同名的变量.而是将数据保存在工人的名为Base.PGRP的相当隐藏的Dict中.要访问这些值,您必须获取RemoteRefs,在您的情况下,它将是类似的结果= @parallel(vcat)for i in 1:length(genes) EM(fetch(genes [i]),fetch(gene_dict [i]),fetch(transcript_dict [i]))结束