지방이의 Data Science Lab

[R] 빅데이터 dcast 램문제를 해결할 수 있는 코딩 본문

Data Analysis/깨R지식

[R] 빅데이터 dcast 램문제를 해결할 수 있는 코딩

[지현] 2019. 4. 7. 21:30

빅데이터 ㄹㅇ 빅데이터일때, 2억개넘어가고, 열이 몇백이 넘어가면 코드하나 치고 돌아가는데 거의 10분걸릴때도 있다.

그럴때 유용하다. 

 

INPUT

 

 

 

 

 

 

 

OUTPUT

 

 

 

 

 

RAM을 줄이면서 코딩짜는 방법 

(1)

100만 행이 넘어가는 데이터가 큰건 무조건 data.frame이 아니라 data.table로 해야 속도가 엄청 빨라진다. 

 

(2)***

추천시스템 알고리즘을 만들때, dcast가 필요했다. 

melt도 해보고, spread도 해보고 다 시도해봤자 데이터 크기가 너무 커서 안됐다. 

이때 그나마빠른게 dcas.data.table이라 생각했는데 이를 능가하는 방법이 있다.

#비추천
aa=summarise(group_by(data_m, COMCSNO, PRDKEY), sumqty=sum(DASBLAFT_SALQTY))   
sample1=dcast.data.table(aa,COMCSNO~PRDKEY,value.var = "sumqty",sum)
a=spread(데이터프레임, 피벗으로 뺄 열 변수이름, value로 처리할 열 이름)

 

 

cast_sparse(data, Row에 넣고 싶은 값, Column에 넣고 싶은 값, value에 들어가면 좋겠는 열)%>%as.matrix%>%as.data.frame

하면 굉장히 빠른 속도로 코드가 돌아간다. 심지어 안돌아가던 코드도 돌아간다.

 

미쳤다. 신세계다. 굉장히 놀라워하는 이유가 램이 좋은건데도 2-3시간 걸리던게 이 코드로는 3분이면 돌아가기 때문이다. 

#추천

dat <- data.frame(a = c("row1", "row1", "row2", "row2", "row2"),b = c("col1", "col2", "col1", "col3", "col4"), val = 1:5)

library(tidytext)
a= cast_sparse(dat, a, b, val)%>%as.matrix.data.frame
a$a = rownames(a)
rownames(a) = NULL

(as.matrix.data.frame 코드가 bytes를 줄일 수 있는 가장 효율적인 방법이다. 하지만, 컴퓨터가 좋지 않아서 

Error in asMethod(object) : Cholmod error 'problem too large' at file.. 이런 코드를 얻는 사람은

as.data.frame.array()를 이용하면 dcast.data.table의 램보다는 줄어든 만큼을 필요로하던데, 이조차 안돌아가는 컴퓨터는 어쩔수 없다. ID로 샘플을 추려서 그나마 돌아가는 양을 돌리는 수밖에.

 

 



Comments