disk.frame 패키지 소개
Page content
공지
- 대용량 데이터 전처리시에 필요한 패키지를 소개한다.
- 주석은 가급적 원어를 남겨 놓으니 잘 번역하기를 바란다.
설치
- 설치 방법은 기존과 마찬가지로 간단하게 작성할 수 있다.
install.packages("disk.frame")
suppressPackageStartupMessages(library(disk.frame))
library(nycflights13)
패키지 주요 아이디어
- 메모리보다 많은 데이터를 각각의
chunks
로 분해하여 하나의 폴더 안에 저장한다. (HDD 디스크 사용) - 자세한 셜명은 Giuhub를 참고 (https://github.com/xiaodaigh/disk.frame)
Setup
- 실습 환경을 구성한다.
setup_disk.frame()
## The number of workers available for disk.frame is 1
# this allows large datasets to be transferred between sessions
options(future.globals.maxSize = Inf)
빠른 시작
- nycflights13 데이터를 활용한다.
- 이 예제는 dplyr 배울 때, 자주 등장하는 예제
- 참고: https://r4ds.had.co.nz/transform.html
disk.frame으로 변환
- 데이터 객체를 disk.frame으로 변환한다.
# convert the flights data.frame to a disk.frame
# optionally, you may specify an outdir, otherwise, the
flights.df <- as.disk.frame(nycflights13::flights, overwrite = TRUE)
class(flights.df)
## [1] "disk.frame" "disk.frame.folder"
flights.df
## path: "/var/folders/zq/ch7gky6n3rzgjf1pd0w2l35w0000gn/T//Rtmp3ymGwx/file61302e8c8834.df"
## nchunks: 1
## nrow (at source): 336776
## ncol (at source): 19
## nrow (post operations): ???
## ncol (post operations): ???
-
객체가 disk.frame으로 변환된 것을 확인할 수 있다.
- 특이한 것은 아래 그림처럼 flights.df가 List로 저장되어 있다는 것이다.
-
그렇다면 데이터는 어디에서 저장되어 있는 것인가?
attr(flights.df, "path")
## [1] "/var/folders/zq/ch7gky6n3rzgjf1pd0w2l35w0000gn/T//Rtmp3ymGwx/file61302e8c8834.df"
- 위 경로가 말해주는 것처럼 필자의 개인 PC에 저장된 것을 확인할 수 있다.
dplyr 문법 활용
- 그렇다면 어떻게 활용할 수 있는가?
- 기존과 똑같이 사용하면 된다.
- 이 때 주의해야 하는 것이 있다면,
collect
를 써야 전체 데이터에 대해 작업을 할 수 있다. - 그러나, 대용량 데이터를 사용할 때에는 collect를 쓰는 것은 의미가 없다.
flights.df %>%
filter(month == 1) %>%
collect %>%
mutate(origin_dest = paste0(origin, dest)) %>%
nrow()
## [1] 27004
- 이번에는 flights 데이터를 직접 불러와서 작업을 해본다.
flights %>%
filter(month == 1) %>%
mutate(origin_dest = paste0(origin, dest)) %>%
nrow()
## [1] 27004
- 결과가 동일한 것을 알 수 있다.
ggplot2와 연동
- 이번에는 ggplot2 패키지와 시각화를 진행해본다.
library(ggplot2)
ggplot(flights.df, aes(x = dep_time, y = sched_dep_time)) +
geom_point()
Error: data
must be a data frame, or other object coercible by fortify()
, not an S3 object with class disk.frame/disk.frame.folder Run rlang::last_error()
to see where the error occurred.
ggplot()
함수에서 요구하는 객체는 아니기 때문에 즉시는 어렵다.- 그렇다면 1차 가공 후에 data.frame으로 바꾸는 코드가 필요할 것 같다.
from flight.df
- flight.df 에서 데이터를 불러와서 직접 시각화를 진행합니다.
library(ggplot2)
flights.df %>% collect %>%
filter(dep_time < 500) -> final_df
print(nrow(final_df))
## [1] 1484
ggplot(final_df, aes(x = dep_delay, y = distance)) +
geom_point() +
ggtitle("From flights.df")
from flights
- flight.df 에서 데이터를 불러와서 직접 시각화를 진행합니다.
flights %>% collect %>%
filter(dep_time < 500) -> final_df
print(nrow(final_df))
## [1] 1484
ggplot(final_df, aes(x = dep_delay, y = distance)) +
geom_point() +
ggtitle("From flights")
- 결과가 동일한 것을 확인할 수 있음
결론
- Code상으로 볼 때에는 약간 불편한 점이 있지만, 크게 어려운 점은 없었다.
- 필자는 M1을 사용하는 데, nchunks를 분할하는 방법이 확실하지 않다.
- 필자는 nchunks=1로 계속 잡힌다. 그러나 예제는 nchunks=6 등으로 설정이 되는데, 이 부분에 대한 부분은 숙제로 남겨둔다.