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)

빠른 시작

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 등으로 설정이 되는데, 이 부분에 대한 부분은 숙제로 남겨둔다.