2011-06-22 14 views
2

私はdoSMPパッケージを使って 'foreach'ループで自分のコードをスピードアップしようとしています。ここでparallizedループ(doSMP)でsource()関数を使用する方法は?

は私の問題の簡易版である:main.R::

require(doSMP) 
dropbox_path = "/home/ruser/Dropbox" 
workers <- startWorkers(4) 
registerDoSMP(workers) 
foreach(jj=1:4) %dopar% source("test.R") 
stopWorkers(workers) 

ファイル:test.R:

message(dropbox_path) 
私はmain.R

というファイル

ファイルを実行しています

これは次のエラーを返します。 "ソース(" test.R ")のエラー: タスク1が失敗しました - "オブジェクト 'dropbox_path'が見つかりません "

私はあることをmain.Rを変更する場合:それはその後、非常にうまく機能

require(doSMP) 
dropbox_path = "/home/ruser/Dropbox" 
workers <- startWorkers(4) 
registerDoSMP(workers) 
foreach(jj=1:4) %dopar% message(dropbox_path) 
stopWorkers(workers) 

。 これはまた、シーケンシャルコード( 'foreach'の代わりに 'for')とうまく機能するために使用されました。

したがって、R子インスタンスはdropbox_path変数にアクセスできますが、ソース関数によって解析された場合はアクセスできません。私はsource()関数の引数 'local'と 'chdir'を使って成功しなかった。

コードが機能する方法をご存知でしょうか?私はsource()関数を使い続けたいと思います。

答えて

1

私の小さな回避策はあなたのツールを使用していないことを前もってお詫びしますが、ここで私はそれをやるでしょう。複数のコアで動作するようにアプリケーション機能を簡単に拡張できるので、私はパッケージsnowfallを使用します。すべてのコアが現在占有されているため、コードはテストされていません。しかし、動作する必要があります。

tiny_script.R内容:

date()

Rコードは、複数のコアを起動するには:

library(snowfall) 
sfInit(parallel = TRUE, cpus = 4, type = "SOCK") #power up 
my.list <- vector("list", 10) 

sfLapply(x = my.list, fun = function(x) source("./Odpad/tiny_script.R")) 

のみlapplyを使用して、単一のコア上で実行:

> lapply(X = my.list, FUN = function(x) source("./Odpad/tiny_script.R")) #notice the difference in argument names between `lapply` and `sfLapply`. 
[[1]] 
[[1]]$value 
[1] "Wed Jun 22 13:02:11 2011" 

[[1]]$visible 
[1] TRUE 


[[2]] 
[[2]]$value 
[1] "Wed Jun 22 13:02:11 2011" 
+0

Iローマ、Iあなたのコードをテストし、同じ問題が発生しました:あなたのtiny_script .Rは変数を使用しません。 date()の代わりに、mine:message(dropbox_path)などの変数を必要とする関数がある場合、dropbox_pathがグローバル環境にある場合、同じエラーが発生します。 私の質問は、ソース内のスクリプトが親環境の変数をどのように使用できるか(2番目の例で示したように、子環境がアクセスできること)ですか? – Sam

+0

@Samすべての変数をコアにエクスポートする必要があります。 'sfExport(list = c(" var1 "、" var2 "、" function1 "))'です。 –

+0

ok()関数は動作しませんが、ソース(script.R)には変数へのアクセス権があります。私はdoSMPの代わりに降雪パッケージを使用できるかどうかを確認します – Sam

関連する問題