2013-09-23 3 views
2

.C을 사용하여 R에서 C 함수를 호출 중입니다. 이것은 몇 분 동안 실행될 시뮬레이션이며 몇 번의 반복을 할 때마다 진행 상황에 대한 정보를 R로 보내고 싶습니다. 즉, C 함수가 모든 정보를 보내기까지 기다릴 필요가 없습니다. R에 한 번만 기입하십시오.C에서 R로 데이터 전달하기

참고 : R (Rprintf 않습니다)에서 인쇄하고 싶지 않습니다. 하지만 나는 이러한 정보를 R에 전달하고 싶습니다. 이 포함되어있는 경우 error을 사용하면 R에 오류가 전달되지만 예외 처리에는 관심이 없습니다.

내 첫 번째 방향 : R에서 futile.logger을 사용하여 이러한 항목을 기록합니다. 이러한 정보가 호출 R 함수가 사용하는 것과 동일한 로거에 전달 될 수 있다면 좋을 것입니다. 하지만 웹상에서 예제를 찾을 수 없었습니다.

대체 방향 : 또한 redis를 사용하여 캐시에 정보를 쓰고 나머지는 redis db에 연결합니다. 하지만 redis에 C 인터페이스를 찾을 수 없습니다. 루아를 사용하고 싶지 않습니다. 가장 가까운 것은 Writing a Custom Redis Command In C - Part 2입니다.

하지만 제 의견에는 훨씬 더 간단합니다. 아이디어가 있으십니까?

업데이트 : 이것이 내가 이상적으로 작동하는 방법입니다.

# PART 1: webserver calls R function 

# the R call 
res = .C("montecarlo_sampler.c", as.matrix(inputData), as.matrix(ouputData), as.integer(iterations)) 


// PART 2: the C function 

void montecarlo_sampler(double *inputData, double *outputData, int *iterations){ 

    // do some preprocessing 
    int iter =1; 
    while(iter<1000000){ 

    if(iter % 1000 == 0) { 
     // summarize output from last 1000 iterations 
     // dump summary data to a logger or redis 
    } 

    // do usual sampling stuff in C 
    } 
} 

PART 3: 
// listening on the django side 
// polls redis every few seconds to see if update has reached. 
// sends summary output for visualization to client 
+0

어떤 종류의 진행 정보가 필요합니까? 데이터를 소비하려는 경우 가장 쉬운 방법은 C 함수에 인덱스 인수를 추가하는 것입니다.이 인수는 문제의 일부만을 계산하여 R에 출력하고 색인의 다음 부분을 계산할 수있게합니다. 문제. –

+0

http://stackoverflow.com/questions/6658168/passing-a-data-frame-from-to-r-and-c-using-call이 유용 할 수 있습니다. – Tim

+0

@KarlForner - 저는 시뮬레이션을하고 있습니다. 그래서 매 회마다 100,000 번 반복되는 추정 된 매개 변수 값을 출력하고 싶습니다. 이 매개 변수 값은 다른 엔진이 간헐적으로 도착할 때 및 사용할 때 사용됩니다. – user1971988

답변

0

정말 짧은 파이프 라인에서 병렬 계산을 수행 하시겠습니까? 이렇게하는 가장 쉬운 방법은 @KarlForner의 제안과 함께 예제 "두 개의 R 프로세스가 비 차단 소켓을 통해 통신"?socketConnection에있는 소켓 연결을 사용하는 것입니다. 공정 1

repeat { 
    ## get input from process 2 
    ## do R calculations 
} 

다른 과정은

repeat { 
    ## call C for a chunk of results 
    ## forward result to process 1 
} 

이 또한 자식 프로세스를 포크로 mcparallel을 사용하고 mccollect와 통신, 비 Windows의 병렬 패키지와 함께 할 수있는 것입니다 것입니다. 이러한 종류의 파이프 라인 구현에 대한 예는 많지 않습니다. 프로세스가 소켓 (!) 또는 redis (C가 아닌 R 레벨에서 redis와 통신)와 같은 제 3 자 통신을 설정해야한다고 생각합니다. 예를 들어 openMP 지시문을 사용하지만 비슷한 구성표를 사용하여 계산을 포크 할 수도 있습니다. R 프로세스는 동의 한 위치에서 결과를 폴링하기 위해 C를 호출합니다. 질문에 대한 업데이트와 같이 솔루션을 보는 것이 흥미로울 것입니다. 귀하가 작업하고있는 도전 과제를 반영하여 게시물의 제목을 수정하는 것이 도움이 될 수 있습니다.

+0

Thanks @Martin - 이제 call_R의 코드 구조를 사용하여 R에서 futile.logger 함수 flag.info를 호출하려고합니다. – user1971988

+0

다른 옵션은 나중에 살펴볼 credis입니다. C와 Redis는 모두 미리 정의 된 키를 통해 정보를 redis에서 가져올 수 있습니다. 나는 내가 끝나면 나의 결과를 여기에 올릴 것이다. 당신의 도움을 주셔서 감사합니다. – user1971988