2016-11-23 78 views
0

ライブラリRserveCLI2を使用して、Linuxマシン上のRserveに接続するASP.Netアプリケーションを構築しています。RServeCLI2は長時間実行されるタスクをサポートしていますか?

私は、Rスクリプトの実行時間を長くして正常に完了するかどうかを確認するためのテストを行いました。以下は私のコードです。

try 
    { 
     using (var rConnection = RserveCLI2.RConnection.Connect(_host, _port, _credentials)) 
     { 
      rConnection.Assign("job.id", new SexpArrayInt(jobId)); 
      rConnection.Eval($"try(source(\"script.R\"), silent=T)"); 
      string errMessage = rConnection.Eval("geterrmessage()").ToString(); 
      if (errMessage == "") 
      { success = true; } 
      else 
      { success = false; } 
     } 
    } 
    catch (Exception e) 
    { success = false; } 
    return success; 

およびRスクリプト:

test.start <- Sys.time() 
test.duration <- (1.2^(job.id)) * 10 # in seconds. 
test.i <- 0 
while(as.numeric(difftime(Sys.time(), test.start), units="secs") < test.duration) { 
    test.i <- test.i + 1 
} 

job.idが効果20%、各繰り返しの持続時間を増加させる反復ごとに一つだけインクリメントRserveから渡されます。同時に実行される5回の反復、それぞれ別々のスレッドから開始されます。

最後に完了したジョブは約1時間40分続いたことがわかりました。次のジョブは、テストを中止してから36時間以内に完了しませんでした。新しい仕事は始められていませんでした。

正しく解釈すると、Evalメソッドは返されませんでした。 e Rserveサーバーでは、テストの最初の時間帯に見たRserveプロセスが2つしかないことがわかりました。

この現象が発生する可能性があり、RserceCLI2がエラーを返してはいけませんか?

答えて

0

この問題は、ネットワークファイアウォールが原因であり、Rserveの問題ではありません。

クライアントとサーバーがネットワークファイアウォールを介して通信していました。このファイアウォールは、2時間アイドル状態の接続をブロックするように構成されています。接続は実際には閉じられません。私が理解しているように、ファイアウォールはそれを行うことはできず、接続されたエンドポイントだけが行うことができます。

おそらく、Rserveはしばらくの間応答を送信しますが、これは決してクライアントによって受信されません。クライアントは応答を待機し続けます。私はRserveがこれにどのように反応するのか調査しませんでした。

クライアントをネットワークの別の部分に移動し、ファイアウォールなしでRserveと通信できるようにしました。

私はOOB (out-of-band) commandsを送って問題を解決できたと思いますが、ハートビートとして機能しますが、使用するRパッケージを開発していないため、実装するのはかなり複雑でした。

関連する問題