본문 바로가기
R

R ) future함수 multisession 병렬처리 알아보기 in r

by C.Mond 2022. 11. 16.
728x90
728x90

future함수의 multisession에 대해 알아보려고 합니다...

 

솔직히 요게 어떤건지 확실히는 모르겠습니다...

 

그런데 core여러개를 이용해 R의 multisession을 만들고 각각의 future를 병렬 실행해 빠르게 data의 결과를 얻을 수 있다는 것은 알것 같습니다... 또한 다른 session에서 코드처리를 진행하기 때문에 내가 현재 사용하고 있는 session에서는 계속해서 코드를 처리할 수 있는것 같습니다.

 

더 자세히 알게되면 업데이트 해야겠습니다...

 

앞서 말했듯 future함수의 multisession을 이용해 data를 더욱 빠르게 처리할 수 있습니다.

 

해당 함수는 future 패키지에 있는 함수 입니다.

 

예시를 보면서 얘기해 보겠습니다.

 

해당 함수의 실습을 위해 iris data를 여러개 붙여 큰 data로 만들었습니다.

 

간단하게 코드를 처리하면서 시간이 얼마나 걸리는지 알아보겠습니다..

 

3개의 data table을 row별 sum을 진행했습니다.

먼저 for만 사용한 경우 입니다.

start1_2 <- Sys.time()
for(i in 1:length(df_list)){
  temp <- df_list[[i]]
  for(j in 1:nrow(temp)){
    sum(temp[j,])
    print(paste0(i,"_",j))
  }
} end1_2 <- Sys.time()
end1_2-start1_2

4.548205분 // 272.8923초 걸렸습니다.

 

다음으로 future함수를 이용해 병렬진행한 경우 입니다.

future의 경우 2개의 형태로 사용할 수 있어 2개형태 모두 적겠습니다.

availableCores()                         사용가능한 코어 확인
plan(multisession, workers = 4) 사용할 코어 정하기
test_future1_2_list <- listenv::listenv()
start2_2 <- Sys.time()
for(i in 1:length(df_list)){
  temp <- df_list[[i]]
  test_future1_2_list[[i]] <- future({
    for(j in 1:nrow(temp)){
      sum(temp[j,])
      print(j)
    }
  })
  print(i)
}
while(TRUE){
  if(sum(resolved(test_future1_2_list))==3){
    end2_2<- Sys.time()
    break
  }
}
end2_2-start2_2

위 코드로 진행하면

1.100988분 // 67.160268초가 걸립니다.

 

또다른 형태의 future를 사용하면

test_future2_2_list <- listenv::listenv()
start3_2 <- Sys.time()
for(i in 1:length(df_list)){
  temp <- df_list[[i]]
  test_future2_2_list[[i]] %<-% {
    for(j in 1:nrow(temp)){
      sum(temp[j,])
      print(j)
    }
  } %plan% multisession
  print(i)
}
while(TRUE){
  if(sum(resolved(test_future2_2_list))==3){
    end3_2<- Sys.time()
    break
  }
}
end3_2-start3_2

1.081089분 // 64.86534초가 걸립니다.

 

시간을 비교해보면 multisesseion을 이용해 처리한것이 3배정도 빠른것으로 확인됐습니다.

 

big data를 다룰때 사용하면 유용할것 같습니다.

728x90
728x90

댓글