2013-06-26 8 views
36

WindowsのRx64のパッケージからmakePSOCKclusterのデバッグに問題が発生しています。 Windows上のR386やOSX、Linuxでは発生しません。残念なことに、それは一貫して起こるわけではなく、時折、そして全くランダムに発生します。システムを呼び出した後にmakePSOCKclusterがx64を獲得してハングアップする

makePSOCKcluster機能はタイムアウトしてRセッションをフリーズしますが、セッションの初期段階では何​​らかの(任意の)system()コールが実行された場合にのみ発生します。以下のビデオとスクリプトは、問題をより明確に示しています。

私は成功せずにしようとしたいくつかのもの:

  • 無効にアンチウイルス/ファイアウォール。
  • systemmakePSOCKcluserの間に数秒待っています。
  • 異なるシステムコールを使用する。

これをさらに絞り込むにはどうすればよいですか?ここでthe videoとビデオで使用されるスクリプトは次のとおりです。

cmd_exists <- function(command){ 
    iswin <- identical(.Platform$OS.type, "windows"); 
    if(iswin){ 
    test <- suppressWarnings(try(system(command, intern=TRUE, ignore.stdout=TRUE, ignore.stderr=TRUE, show.output.on.console=FALSE), silent=TRUE)); 
    } else { 
    test <- suppressWarnings(try(system(command, intern=TRUE, ignore.stdout=TRUE, ignore.stderr=TRUE), silent=TRUE));  
    } 
    !is(test, "try-error") 
} 

options(hasgit = cmd_exists("git --version")); 
options(haspandoc = cmd_exists("pandoc --version")); 
options(hastex = cmd_exists("texi2dvi --version")); 
cluster <- parallel::makePSOCKcluster(1); 
+2

+1のままのビデオのアイデア... – agstudy

+0

オプション()呼び出しを削除しても問題ありませんか?特に1つがあるかどうか試してみることもできます... makePSOCKclusterの実装を見て、どこがハングするかを確認することもできます。 –

答えて

2

makePSOCKCluster、またはより一般的にmakeCluster、いわゆるworkerプロセスを作成するときにRscriptを使用して、新しいRセッションを開始することを伴う、任意の数の理由のためにハングアップすることができますコマンドは.slaveRSOCK関数を実行し、ソケット接続をマスターに戻してから、slaveLoop関数を実行して、最終的にマスターが送信したタスクを実行します。何かのワーカープロセスを開始するときに何かが間違っていると、そのワーカーが死んでしまったり、うまく作成されなかったりしても、そのソケットに接続するのを待って、マスターはsocketConnectionの実行中にハングします。

outfile引数を使用すると、ワーカープロセスが終了してマスターがハングアップする原因となるエラーが表示されることが多いため、大変便利です。しかし、それが何も明らかでなければ、マニュアルモードにしてください。手動モードでは、マスターはコマンド自体を実行する代わりに、各ワーカーを開始するコマンドを出力します。それはより多くの作業ですが、完全な制御を提供し、必要に応じて作業者にデバッグすることさえできます。

> library(parallel) 

> cl <- makePSOCKcluster(1, manual=TRUE, outfile='log.txt') 
Manually start worker on localhost with 
    '/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=localhost 
PORT=10187 OUT=log.txt TIMEOUT=2592000 METHODS=TRUE XDR=TRUE 

次は新しいターミナルウィンドウ(コマンドプロンプト、または何でも)を開き、そのRscriptコマンドを貼り付けます。

は、ここでの例です。実行した直後に、1人のワーカーしか要求していないので、makePSOCKclusterが返されます。もちろん、何かがうまくいかなかった場合は返されませんが、運が良ければ、端末ウィンドウにエラーメッセージが表示され、問題の解決につながる重要なヒントが得られます。あまり運がよければ、Rscriptコマンドもハングアップするので、もっと深く掘り下げなければなりません。

ワーカーをデバッグするには、対話セッションが必要なため、表示されているRscriptコマンドを実行しないでください。

$ R --vanilla --args MASTER = localhostのPORT = 10187 OUT = log.txtというTIMEOUT = 2592000 METHODS = TRUE XDR =

TRUE:代わりに、次のようなコマンドでRセッションを開始します

そのRセッションでは、ブレークポイントを。その後、slaveRSOCK機能と、それを実行します。

> debug(parallel:::.slaveRSOCK) 
> parallel:::.slaveRSOCK() 

今、あなたはおそらくslaveLoopとmakeSOCKmaster関数にブレークポイントを設定し、コードをステップ実行を開始することができます。

+0

私は同じ問題を抱えていました.Rscriptコマンドを使って新しいRセッションを開始するというヒントは非常に便利でした。 Rに起動時に問題が発生する場合(たとえば、アクセスできないネットワークドライブ、.Rsiteファイルのエラー)、クラスタの作成時にmakePSOCKclusterがハングアップします。私の場合、Rはネットワークの問題のためにほとんど目立ちませんでした。不正なネットワークパスを削除した後、問題なくmakePSOCKclusterを使うことができました。 – tomka

関連する問題