보통 외부 데이터 불러오기 할 때 {utils} package의 read.table() 함수를 사용하곤 합니다.
크기가 작은 데이터라면 별 문제를 못느낄 텐데요, 만약 데이터 사이즈가 수 메가, 기가 단위의 큰 데이터라면 데이터를 불러들이는데 너무 오랜 시간이 걸려서 문제가 될 수 있습니다.
대용량 데이터 처리에 아주 뛰어난 성능을 발휘하는 data.table 패키지의 fread() 함수를 사용하면 큰 용량의 외부 데이터도 빠르게 불러올 수 있습니다.
(물론 R은 메모리에 데이터를 올려놓고 처리/분석을 하므로 하둡에서 말하는 수테라급의 대용량에는 필적을 못하구요, 분산병렬처리도 아니긴 합니다. 이 포스팅에서 말하는 대용량은 책보고 공부할 때 사용하는 수십, 수백개 row 를 가진 예제 데이터 대비 실전에서 사용하는 수십만, 수백만, 수천만 row 데이터를 말하는 것입니다. ^^;)
아래에 간단한 샘플 데이터를 만들어서 {utils} 패키지의 read.table() 함수와 {data.table} 패키지의 fread() 함수의 데이터 불러오는데 소요되는 시간을 비교해보았습니다.
[ 외부 데이터 읽어오기 : {utils} 패키지 read.table() 함수 vs. {data.table} 패키지 fread(0 함수 ]
1. 샘플 데이터 만들기 : 1 백 만개 row, 변수 2개를 가지는 데이터 프레임
# generating large scaled data my_data <- data.frame(var1 = rnorm(n = 1000000, mean = 0, sd = 1), var2 = rnorm(n = 1000000, mean = 2, sd = 3))
|
> str(my_data) 'data.frame': 1000000 obs. of 2 variables: $ var1: num -0.556 1.787 0.498 -1.967 0.701 ... $ var2: num 1.669 0.597 4.452 1.405 6.936 ...
|
# exporting to text file write.table(my_data, "/Users/Desktop/R/my_data.txt", sep = "|", row.names = FALSE, quote = FALSE)
|
2. {utils} 패키지의 read.table() 함수를 사용해서 my_data.txt 불러오기
system.time() 함수로 데이터를 불어오는데 소요된 시간을 재어보았더니 7.287초가 나왔습니다.
(매번 할 때마다 소요 시간이 조금씩 차이가 날 수는 있습니다)
# reading text file : (1) read.table() of {utils} package > system.time(my_data_readtable <- read.table("/Users/Desktop/R/my_data.txt", + sep = "|", + header = TRUE, + stringsAsFactors = FALSE)) user system elapsed 7.161 0.100 7.287
|
3. {data.table} 패키지의 fread() 함수를 사용해서 my_data.txt 불러오기
data.table 패키지는 기본 패키지가 아니므로 먼저 별도 설치(install.packages) 및 호출(library)이 필요합니다.
(매번 할 때마다 소요 시간이 조금씩 차이가 날 수는 있습니다)
# reading text file : (2) fread() of {data.table} package install.packages("data.table") library(data.table)
|
system.time() 함수로 my_data를 불러오는데 걸린 시간을 재어봤더니 0.256초가 걸렸습니다.
> system.time(my_data_fread <- fread("/Users/Desktop/R/my_data.txt", + sep = "|", + header = TRUE, + stringsAsFactors = FALSE)) user system elapsed 0.242 0.014 0.256
|
1백만 행을 가진 데이터프레임을 읽어오는데 있어, 앞서 read.table() 함수가 7.287 초 걸렸던데 반해, fread() 함수는 0.256 초밖에 걸리지 않았습니다. fread() 함수는 read.table() 함수를 사용했을 때 대비 약 96.5% 정도 속도가 더 적게 걸린 것입니다. 놀랍지요?!!!
> 0.256/7.287 [1] 0.03513106
|
R 은 대용량 데이터에는 맥을 못춰라고 지레 평가절하하기 보다는 {data.table} 패키지의 fread() 함수로 대용량 데이터 불러오기 속도 문제를 공략해보시지요.
많은 도움이 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~'을 꾸욱 눌러주세요. ^^