(R) 성능 향상: 속도와 메모리

1. 속도향상을 위한 벡터화

ifelse(), which(), where(), any(),all(), cumsum(), cumprod()가 있다.
행렬의 경우 rowSums(), colSums() 등이있다.




2. 함수평 프로그래밍과 메모리 문제

대부분 R 객체는 '불변성'을 갖고 있어서 변경할 수 없다. 그래서 R연산은 특정 객체를 재할당하는 함수로 구현돼 있는데, 이런 성격은 성능에 영향을 미친다.


*벡터할당 문제

z[3]<-8

이것은 내부에서 z를 복사하고 복사본의 3번쨰 원소를 8로바꿔, 결과 벡터를 z에 재할당한다. 그리고 이때 결과의 z는 복사본을 가리키고 있다는 것을 기억하자.

즉 벡터원소 하나를 바꿧을 뿐이지만, 문법적으로는 '벡터 전체를 새로 계산한 것이다'




tracemem()은 메모리 재배치에 대해 알려준다.(주소를 알려줌)



*리스트를 여러개 만드는 것보다 행렬 하나를 만드는게 빠르다..


*코드에서 느린 부분을 찾을 때 사용하는 Rprof()




********R세션의 모든 객체는 메모리에 저장된다. 램사이즈의 크기에 관계없이 231-1바이트의 객체 크기 제한이 있다. 하지만 좀만 신경을 쓰면 많은 메모리를 필요로하는 프로그램도 R에서 잘 사용할 수 있따.
청킹과 메모리 관리용 R패키지이다.


  1. 청킹
파일로부터 한번에 하나의 청크 단위로 부터 데이터를 읽어 들이는 방법이다. 예를들어 특정 변수의 평균이나 크기를 알고자 한다고하면, 이때 read.table()에서 skip인수를 사용할 수 있다. 

데이터세트에 1,000,000개의 데이터가 있고 이를 10개 혹은 그 이상으로 메모리에 적합한 크기로 데이터를 잘랐다고 하자. 그리고 처음에는 skip=0으로 설정하고 두 번째는 skip=100000라고 설정해보자. 매번 청크를 읽을 때마다 각 청크의 수나 총합을 계산해 기록한다. 전체 평균이나 크기를 계산할 필요없이 모든 청크를 다 읽은 후 기록된 수나 합을 더해주면 된다.



  2. 메모리 관리를 위한 R패키지 사용하기

큰 메모리가 필요한 경우 메모리 관리용 R 패키지를 사용하는 것이 더 나은 대안이다.
이런 패키지 중 하나로는 SQL데이터베이스에 R을 인터페이스 해주는 RMySQL이 있다. 
이 패키지를 통해서 SQL로 데이터베이스 단에서 변수 선택 작업을 하고 SQL로 처리된 결과를 읽어올 수 있다.
이렇게 읽어온 결과는 전체 데이터 세트에 비해 훨씬 작아지므로, R의 메모리 제한을 피할 수 있다.

다른 패키지로는 큰 데이터세트를 사용해 회귀분석 및 일반적인 선형 모델분석을 해주는 biglm이 있다. 이 패키지도 청킹을 사용하지만 좀 다른 방식이다. 

오늘날 일반적으로 사용하는 ff패킺는 데이터를 메모리가 아닌 디스크에 저장함으로써 이를 피해간다.
bigmemory경우도 마찬가지지만, 이 패킺는 디스크 뿐만아니라 컴퓨터의 메인메모리에도 데이터를 저장할 수 있으므로 멀티코어 컴퓨터의 경우 매우 이상적으로 활용할 수 있다.


댓글

이 블로그의 인기 게시물

(18장) WebSocekt과 STOMP를 사용하여 메시징하기

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬