2016-11-23 1 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 패키지를 개발하지 않았기 때문에 구현하기가 매우 복잡했습니다.

관련 문제