R의 계산 속도?


16

저는 현재 큰 확률 론적 모델 중 하나를 SAS에서 새로운 언어로 옮기는 일을 맡았습니다. 개인적으로, 나는 전통적인 컴파일 언어를 선호하지만, PI는 내가 사용한 적이없는 R을 확인하기를 원합니다. SAS에서 모델을 가져 오기위한 우리의 동기는 (1) 많은 사람들이 SAS가 비싸기 때문에이 모델에 액세스 할 수 없다는 것입니다. 우리가 가진 모델의 유형.

(1)에 대해, 명백하게 R은 자유로울 필요성을 만족시킨다. (2)의 경우 이상적으로는 실행 파일을 만들고 싶지만 R은 일반적으로 스크립트 언어로 사용됩니다. 누군가 최근에 R 컴파일러를 내놓았다는 것을 알았습니다. 사용하기 쉬운가요? 오히려 사용자가 R을 직접 다운로드하도록 강요하지는 않습니다. (3)의 경우, SAS의 문제는 데이터 세트를 읽고 쓰는 데 소비되는 시간입니다. 우리 모델은 계산 집약적이며 종종 런타임에 의해 제한됩니다. (예를 들어 누군가 주말에 사람들의 컴퓨터를 납치하여 실행을 수행하는 것은 드문 일이 아닙니다.) 모든 작업이 메모리에서 이루어지기 때문에 동일한 문제가없는 유사한 모델이 Fortran에 내장되어 있습니다. R은 어떻게 작동합니까? 데이터 단계에서 작동한다는 점에서 SAS와 동일합니까? 파일을 읽고 쓰는가? 아니면 메모리에서 배열 조작을 할 수 있습니까?


일반적으로 단일 작업으로 모든 작업을 수행하여 sas 속도를 높일 수 있습니다. 효과적으로 데이터를 한 번만 읽을 수 있으므로 I / O 시간이 줄어 듭니다. 많은 절차를 사용하면 속도가 느려집니다. 예를 들어, proc glm 또는 proc logistic (부트 스트랩 등)을 반복적으로 호출하는 모델을 작성하면 많은 % proc 호출 (예 : 매크로 % do 루프 사용)을 호출하는 것보다 방대한 데이터 세트를 작성하고 by 문을 사용하는 것이 더 빠릅니다. 당신이 잘 SAS 프로그램, 당신은 적어도 더 이상은 다른 소프트웨어보다 인한 읽고 (파일을하고 출력하기에 런타임 문제가 안됩니다
probabilityislogic

또한 R에서 행렬을 사용하는 방법과 유사한 방식으로 sas 데이터 단계에서 임시 배열을 사용할 수 있습니다.
chanceislogic

답변:


18

R은 메모리 내에서 작동하므로 대부분의 기능을 위해서는 데이터가 메모리에 맞아야합니다.

컴파일러 패키지는 내가 생각하고있는 것을 생각하고 있다면 ( R과 함께 제공되는 루크 티어니 (Luke Tierney)의 컴파일러 패키지)는 전통적인 의미에서 컴파일 된 언어와 동일하지 않습니다 (C, Fortran). Java VM에 의해 실행되는 Java 바이트 코드 또는 Emacs LISP 코드의 바이트 컴파일과 관련하여 R에 대한 바이트 컴파일러입니다. R 코드를 기계 코드로 컴파일하지 않고 R 코드를 바이트 코드로 준비하여 원시 R 코드보다 더 효율적으로 해석 할 수 있습니다.

Fortran을 잘 구성했다면 아마도 두 세계를 모두 이용할 수있을 것입니다. R은 컴파일 된 포트란 루틴을 호출 할 수 있습니다.


감사! 훌륭한 R 그래픽을 가질 수 있고 컴파일 된 포트란 루틴을 호출 할 수 있다는 것은 좋은 일입니다. 이것은 답이 될 수 있습니다!
Melissa

2
메모리에 대한 Gavin의 메모를 확장하려면 다음과 같이하십시오. 더 큰 데이터 세트로 작업하는 경우이 CRAN 작업보기에서 큰 메모리 섹션을 참조하십시오. cran.r-project.org/web/views/HighPerformanceComputing.html
Brandon Bertelsen

1
또한 Rcpp를 사용하여 성능을 점진적으로 향상시킬 수 있다는 점도 중요합니다.
Brandon Bertelsen

Rcpp는 R과 함께 사용하기 위해 C ++를 래핑하는 데 유용합니다.이 프로세스는 (대규모) 도움이되지만 여전히 R의 기본 도구를 사용하여 컴파일 된 코드를 호출합니다. OP에 이미 포트란 코드 나 포트란 기술이있는 경우 Rcpp의 사용량이 적을 수 있습니다.
복원 모니카-G. 심슨

13

나는 SAS15 년 동안 사용해 왔으며 R지난 6 개월 동안 진지하게 사용하기 시작했으며 , 그보다 몇 년 앞서 약간의 땜질이 생겼습니다. 프로그래밍 관점에서 R 데이터 조작을 직접 수행하는 것은 필요하지 않기 때문에 이에 상응하는 절차 DATAPROC SQL절차가 없습니다 (후자는 SAS관리 데이터와 같은 외부 데이터 소스에서 수행 할 데이터 조작이 많을 때 더 효율적입니다 ). 즉, 이제 문제가 발생하면 데이터 조작이 빨라지고 R훨씬 적은 코드가 필요합니다.

내가 만난 주요 문제는 메모리입니다. 모든 R 패키지가 WEIGHT유형 스펙을 허용하는 것은 아니므로 , 또는 명령문에 SAS사용 된 변수 가있는 데이터 세트 가있는 경우 문제가있을 수 있습니다. R 의 및 패키지를 살펴 보았지만 모든 R 패키지와 호환되는 것으로 보이지 않으므로 비교적 드물고 집계 된 분석이 필요한 매우 큰 데이터 세트가있는 경우 메모리에 문제가있을 수 있습니다.FREQREPLICATEffbigmemory

자동화의 경우, 해당 기능 SAS macros을 프로그래밍하고 R배치로 실행할 수 있어야합니다 .

의 코딩을 위해 R, 나는 Notepad++언어를 사용 하고 언어를 설정했고 R, 지금의 기쁨을 발견하고 R Studio있습니다. 이 두 제품은 모두 무료이며 개선 된 SAS구문 GUI 와 같은 언어 마크 업을 수행합니다 (의 구문 화면 만 사용했습니다 SAS).

웹 사이트 에서 교환 사람들을위한, 그리고 관련 책 SAS으로는 R. 일부 SAS명령을로 변환하는 방법을 알아내는 데 유용하다는 것을 알았습니다 R.

업데이트 :에 올 때 너트 저를 몰고 한 가지 RR모든 (데이터 세트 가정하지 않습니다 data frame에서 R용어)는 방식으로 통계 패키지가 아니기 때문에, SAS, SPSS, Stata, 등이다. 예를 들어, 벡터 (또는 행렬)가있는 문에 if대한 도움말을 계속 얻었 if지만 . 따라서 수행하려는 명령이 보유한 데이터 오브젝트 유형으로 작동하는지 확인해야하기 때문에 도움말 페이지를 평소보다 더 자세히 읽어야 할 수도 있습니다.ifdata frames

새로운 R명령 (예 : 컨트 리뷰 션 된 패키지의 분석 방법)을 배울 때 여전히 나를 미치게 만드는 것은 명령에 대한 도움말이 완전히 독립적 인 것은 아니라는 것입니다. 도움말 페이지로 이동하여 명령 및 자주 사용되는 명령에 대해 알아 봅니다 .... 때로는 어디에서 할 수 있거나해야 할지를 해결하려고 노력 ...하면서 재귀 루프로 이어졌습니다. SAS구문에 대한 자세한 예제와 예제의 연구에 대한 설명 이 포함 된 도움말 노트의 상대적 간결함 은 상당히 큰 충격이었습니다.


2
+1 통계 소프트웨어 리소스에 대한 링크를 수집 한 메타 스레드 업데이트를 고려하십시오 . R에 대한 답변과 SAS에 대한 답변 중 하나가 있습니다. 둘 다 r4stats.com에 대한 링크를 갖는 것이 좋습니다. (이 스레드는 실제로 FAQ의 일부입니다. 최신 상태를 유지하고 유용하게 유지하기를 바랍니다.)
whuber

1
R에는 RODBC 드라이버 또는 SQLite를 통한 SQL 액세스를 지원하는 패키지도 있습니다.
DWin

1
R 도움말에 대한 귀하의 의견에 동의합니다. 나는 실제로 몇 년 전에 R 메일 링리스트 중 하나에 대해 당신이 말하는 것을 본질적으로 지적했습니다. 반응은 긍정적이지 않았다. 공평하게, 나는 (a) 아마 나 자신을 잘 표현하지 않았으며 구체적인 예를 제시하지 않았으며 (b) 그 문제를 추구하지 않았다. 요약하면, 문제 1은 예가 너무 복잡하고 관련이없는 개념이 너무 많습니다. 복잡한 예제는 괜찮지 만 간단한 예제를 따라야합니다. 문제 2는 예제의 기능에 대한 주석이나 설명이 거의 없다는 것입니다.
Faheem Mitha

R "도움말"에 관해서는 내 상사가 내게 말한 것을 떠올리게한다. "컴퓨터에서 R이 옆에 앉아있는 것을 이미 알고있는 사람과 함께 R을 배우는 것"
chanceislogic

그리고 다른 모든 사람들을 위해 책과 스택 오버플로가 있습니다. 그렇습니다. R을 혼자서 배우는 것은 매우 어렵습니다.
Michelle

10

R은 프로그래밍 언어입니다. 데이터 단계에서는 작동하지 않습니다. 그것은 당신이 원하는 모든 일을합니다. 왜냐하면 그것은 프로그래밍 언어 일뿐입니다. 당신의 욕망의 노예 일뿐입니다.

Fortran 또는 C와 같지만 암시 적 벡터화로 배열을 반복 할 필요가 없으며 동적 메모리 관리를 통해 언제든지 malloc ()하거나 배열 크기를 선언 할 필요가 없습니다.

대부분 메모리에서 모든 작업을 수행하지만 파일의 일부를 읽고 녹인 다음 결과를 뱉어 내고 다음 비트를 읽으면 R 프로그램을 작성하십시오. 것을 수행.

모델이 계산 집약적이지만 I / O로 인해 SAS가 느리다는 말에 모순됩니다.

Fortran에서 비슷한 것을 이미 가지고 있고 해석 된 언어에서 벗어나고 싶다면 Fortran에서도 왜 그렇게하지 않습니까?

R 컴파일러는 약간의 속도 향상을 야기 할 수 있지만, R 코드가 제대로 작성되면 C 나 Fortran으로 작성하는 것과는 달리 너무 큰 것이 없습니다.


아, 나는 나 자신을 잘 설명하지 않았다. SAS에서는 I / O에 너무 많은 시간을 소비하는 데이터 세트 조작에 집중합니다. 나의 초기 제안은 포트란 (Fortran) 이었지만, PI는 우리가 R로 전환하는 데 관심이 있기 때문에 그것을 확인하기를 원했습니다. 감사!
Melissa

7

기본적으로 SAS는 메모리보다 큰 모델에서 작동 할 수 있지만 biglm 또는 ff와 같은 패키지를 구체적으로 사용하지 않는 한 R의 경우에는 해당되지 않습니다.

그러나 벡터화 할 수있는 R에서 배열 작업을 수행하는 경우 매우 빠릅니다. 경우에 따라 C 프로그램 속도의 절반 속도 일 수 있지만 벡터화 할 수없는 무언가를 수행하는 경우 꽤 보일 것입니다. 느린. 예를 들자면 :

# create a data.frame with 4 columns of standard normally distributed RVs
N <- 10000

# test 1
system.time( {df1 <- data.frame(h1=rnorm(N),
                h2=rpois(N, lambda=5),
                h3=runif(N),
                h4=rexp(N))
} )
# about 0.003 seconds elapsed time

# vectorised sum of columns 1 to 4
# i.e. it can work on an entire column all at once
# test 2
system.time( { df1$rowtotal1 <- df1$h1 + df1$h2 + df1$h3 + df1$h4 })
# about 0.001 seconds elapsed time

# test 3
# another version of the vectorised sum
system.time( { df1$rowtotal2 <- rowSums(df1[,c(1:4)]) })
# about 0.001 seconds elapsed time

# test 4
# using a loop... THIS IS *VERY* SLOW AND GENERALLY A BAD IDEA!!! :-)
system.time( {
        for(i in 1:nrow(df1)) {
                df1$rowtotal3 <- df1[i,1]+ df1[i,2] + df1[i,3] + df1[i,4]
        }
} )
# about 9.2 seconds elapsed time

N을 10에서 100,000으로 증가 시키면 20 분 후에 테스트 4를 포기했지만 테스트 1 : 3은 각각 61, 3 및 37 밀리 초가 걸렸습니다.

N = 10,000,000의 경우, 테스트 1 : 3의 시간은 3.3 초, 0.6 초 및 1.6 초입니다.

이것은 i7 랩탑에서 수행되었으며 N = 10million의 경우 480mb에서 메모리는 문제가되지 않았습니다.

32 비트 윈도우 사용자의 경우 메모리 용량에 관계없이 R에 1.5GB 메모리 제한이 있지만 64 비트 Windows 또는 64 비트 Linux에는 이러한 제한이 없습니다. 요즘 메모리는 내 시간의 시간과 비교할 때 매우 저렴 하므로이 문제를 해결하는 데 시간을 소비하지 않고 더 많은 메모리를 구입합니다. 그러나 이것은 모델이 메모리에 적합하다고 가정합니다.


1
(+1) 유용한 일러스트레이션을 제공해 주셔서 감사합니다. Sean!
whuber

3

(2) 이상적으로는 실행 파일을 만들고 싶지만 R은 일반적으로 스크립트 언어로 사용됩니다.

그렇습니다. 이것이 R로 옮겨야 할 좋은 이유입니다. R 패키지 작성의 관심은 사용자가 R에서 제공하는 다른 도구와 쉽게 상호 작용할 수 있도록하는 것입니다. 이것이 중요하지 않다고 생각되면 C / C ++ 또는 좋아하는 컴파일 언어를 고수하십시오.

영형()rle()

따라서 매우 조심하십시오. 처음 시도한 후에는 R에 혐오감을 느낄 것입니다. 이상한 구문 등으로 느리게 느껴질 수 있습니다. 일단 알게되면 매우 효율적인 도구가 될 수 있습니다. R에서 C / C ++ 코딩을위한 예비 단계로 메소드를 스크립팅하여 종료 할 수도 있습니다. 궁극적 인 단계는 사전 컴파일 된 함수를 작성하기 위해 R의 API를 배우는 것이며, R 마법사가 될 것입니다. :)


2

메모리에서 배열 조작은 SAS에게는 큰 일입니다. R과 관련된 세부 사항을 모르지만 R, ff 및 bigmemory에 대한 메모리 확장 패키지가 데이터를 메모리에서 디스크로 이동하기 때문에 R이 기본적으로 메모리에서 작동한다고 생각합니다. 속도 나 메모리 사용량을 향상 시키려면 포인터가 있습니다. 속도를 높이려면 먼저 의도 한대로 R을 사용해야합니다. 즉, 코드를 벡터화하고 바이트 코드 컴파일을 사용해야합니다. (또한 메모리 복사 작업을 가능한 많이 피하십시오.) 둘째, 제공된 코드 프로파일 러 Rprof ()를 사용하여 코드에서 느린 패치를 식별하고 필요한 경우 C 또는 C ++로 다시 작성하십시오. 더 많은 메모리가 필요한 경우 read.table () 함수의 skip 인수를 사용하여 한 번에 데이터를 한 덩어리 씩 읽을 수 있으며 RMySQL과 같은 패키지를 사용하여 데이터베이스 조작 유틸리티를 R에 추가 할 수도 있습니다. 여전히 더 많은 메모리가 필요하고 그에 따른 속도 감소가 가능한 경우 snow 패키지를 사용하여 R을 병렬로 실행할 수 있습니다. (작년 말에 출판 된 Norman Matloff의 "The Art of R Programming"책에서 이에 대한 자세한 내용을 확인할 수 있습니다. 여기에 언급 된 패키지에 대한 자세한 내용은 온라인에서 찾을 수 있습니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.