2016-06-13 3 views
2

スクリプトファイルからの相対パスを使用してすべてをロードするのが簡単であるため、includeファイルをJuliaスクリプトに入れると、便利なBase.source_dir()が見つかりました。これは、並列化されたコードでは正しく動作しません。我々が持っている場合たとえば、/Users/username/test/でテストファイルは、次のコードで、test.jlと呼ばれる:Juliaの二次作業者のソースディレクトリを取得するには?

@everywhere println(pwd()) 
@everywhere println(Base.source_dir()) 

、我々は我々が得るjulia -p 1 test/test.jlを実行

/Users/username 
    From worker 2: /Users/username 
/Users/username/test 
    From worker 2: nothing 

include別のファイルへの最も強力な方法であるものそれはtestディレクトリにもありますか?

答えて

2

私は通常、このようなものを使用します。

function sendto(p::Int; args...) 
    for (nm, val) in args 
     @spawnat(p, eval(Main, Expr(:(=), nm, val))) 
    end 
end  

SourceDir = Base.source_dir()  

for (idx, pid) in enumerate(workers()) 
    sendto(pid, SourceDir = SourceDir) 
end  

@everywhere include(string(SourceDir, "/", "FileName")) 

sendto()関数のソースだけでなく、労働者の間でデータを移動するための他の有用なツールの多くはこちら(Julia: How to copy data to another processor in Julia)を参照してください。

+0

合意。あなたのソリューションは多くの状況で機能するはずだから、タイトルを変更した。私が2週間でグーグルでグーグルで見つけたときにそれを見つけるのに役立つだろう。 – tlnagy

+0

このポスト(http://stackoverflow.com/questions/27677399/julia-how-to-copy-data-to-another-processor-in-julia)も参照してください。同様の 'getfrom()'関数もあります。実際にタイトルを変更することをお勧めします。あなたの新しい人物は、基本的にもう一方の人物と重複しているかもしれません。 –

+0

私は実際に '@eval @ everywhere'ソリューションがその投稿にたくさん好きです – tlnagy

2

あまり一般が、間違いなくこの特定の場合のためのよりエレガントな解決策は、以下である:@airetiesによって指摘されるようJulia: How to copy data to another processor in Juliaから適合させた

source_dir = Base.source_dir()  
@eval @everywhere include(joinpath($source_dir, "test2.jl")) 

。私は両方を解決策として残します。

関連する問題