나는이 답변을 위해 높고 낮게 보았으므로 여기에 올리는 것에 의지했다. 리눅스 C++ 프로그램에서 R 스크립트/함수를 RCpp 같은 것으로 호출하면 눈에 띄는 대기 시간이 예상됩니까? 이것이 예상되거나 합리적이라고 생각하십니까? Java JAR 파일의 RCaller와 같은 것을 사용하면 어떨까요? 같은 R 스크립트/함수를 호출하는 경우 C++이 Java보다 여전히 빠르다고 생각하십니까? 예상되는 차이점은 무엇입니까? 감사합니다C++ 또는 Java 호출 R 스크립트의 RCPP 또는 RCaller의 벤치마킹?
답변
나는 당신의 C++ 응용 프로그램에 R을 임베드하는 것을 매우 쉽게 만드는 RInside을 원한다고 생각합니다. Qt, Wt (웹 응용 프로그램 용) 및 MPI와 함께 사용하는 몇 가지 예를 포함하여 4 개의 디렉토리에 수많은 예제가 제공됩니다.
이 프레임 워크에서 R을 시작시 한 번 인스턴스화 한 다음 사용자 고유의 인스턴스가 있습니다. 왕복 대기 시간은 R 인스턴스로 명령을 보내는 데 걸리는 시간이 될 것입니다. 그러나 R이 길어지면 (잘 지배 할 수도 있음) 리턴을 더한 것입니다.
RInside는 Rcpp을 사용하므로 전체 개체 전송 및 기타 모든 유용한 정보를 얻을 수 있습니다. RInside 예제를 살펴보고 rcpp-devel 목록에 질문을 게시하십시오.
저는 R 외부 기능 인터페이스 나 RCpp에 대한 특별한 지식이 없지만 꽤 많은 다른 것들과 함께 작업 해 왔습니다. 질문에 확실하게 답변 할 수 없습니다. 엄지 손가락 몇 가지 규칙 만 있습니다. FFI의 역할은 호출 및 호출 된 환경 모두의 가정을 만족시키는 것입니다. 일반적으로 두 언어의 데이터 레이아웃을 서로 복사하여 일치시키는 것입니다. (이것이 RCpp의 모든 것입니다.) 아니면 운이 좋고 일치시킬 수 있습니다. 런타임 환경이 비슷하거나 언어 경계를 넘어서 이동하는 데이터가 작 으면 매우 효율적일 수 있습니다. 자체 함수 호출보다 훨씬 비용이 많이 들지 않습니다. 이런 이유로 Fortran에서 C를 호출하는 것은 종종 매우 빠릅니다. 환경이 매우 다른 경우 큰 데이터 구조를 복사해야합니다. 복사본은 메모리 및 프로세서 사이클과 같은 리소스를 소모합니다. 가비지 콜렉션은 환경 간의 차이를 포스터로하는 자식입니다. 분리 된 콜렉터는 거의 협력하지 않습니다. R과 Java (가비지 수집 모두)는 아마도 이런 이유로 복사가 필요할 것입니다. C++을 calL에 특별히 작성하는 경우 RCpp 구조로 데이터를 설정하여 사본이 필요하지 않도록 할 수 있습니다.
나는 인터페이스를 통해 이동해야하는 데이터의 양을 모방 한 C++로 시작하는 작은 테스트를 작성하려고합니다. 그들을 실행하고 오버 헤드 비용을 얻을 시간. 이것으로 실제 결정을 내릴 수 있습니다.
좋은 대답 유전자. C++ 내에서 데이터를 유지하고 R을 사용하는 팁에 너무 고마워요. 내 문제는 대기 시간과 관련 될 수 있습니다. Java의 가비지 컬렉터를 사용하면 실제로 걱정할 필요가 없기 때문에 걱정할 수도 있습니다. 아마도 C++가 현명한 선택 일 것입니다. –