2014-12-26 6 views
5

Ich möchte eine parallele for-Schleife ausführen. Ich brauche jeden meiner Prozesse Zugriff auf 2 große Wörterbücher, gene_dict und transcript_dict. Das ist, was ich versucht zuerstJulia: Parallel For Schleife mit großen Daten verschieben

@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 

aber ich bekomme die folgende Fehlermeldung auf alle Prozesse (nicht nur auf 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) 

Ich dachte @spawnat die drei Datenstrukturen ich alle brauchen bewegen würde die Prozesse. Mein erster Gedanke ist vielleicht, dass diese Bewegung eine Weile dauert und die parallele for-Schleife versucht zu laufen, bevor die Datenübertragung abgeschlossen ist.

Antwort

7

Die Daten werden um @spawnat verschoben, aber sie ist nicht an Variablen mit demselben Namen wie der Name auf dem Master-Knoten gebunden. Stattdessen werden die Daten in dem ziemlich versteckten Dict namens Base.PGRP auf den Arbeitern gespeichert. Um die Werte zugreifen, werden Sie zu fetch haben die RemoteRef s, die in Ihrem Fall wäre, so etwas wie

result = @parallel (vcat) for i in 1:length(genes) EM(fetch(genes[i]), fetch(gene_dict[i]), fetch(transcript_dict[i])) end

+0

Ihre Lösung toll gearbeitet, als ich in einer interaktiven Sitzung julia arbeiten. Aber als ich versuchte, mein julia-Skript von der Konsole aus anzurufen, bekomme ich immer noch den Fehler, den ich erwähnt habe. Hast du eine Ahnung, warum das so ist? – bdeonovic

+0

Ich sehe nicht, warum es einen Unterschied machen sollte. Was passiert, wenn Sie das Skript mit 'include (" stript.jl ")' aus einer interaktiven julia-Sitzung ausführen? –

+0

es funktioniert dann auch – bdeonovic