readrパッケージのwrite_rds関数を使うことで、オブジェクト(ベクトルやデータフレームなど)をファイルに保存することができる。このファイルに保存した内容は、後(Rの再起動後も可)でread_rds関数を使ってその環境に読み込み再利用することができる。save関数と異なり、一つのオブジェクトしか保存することができず、readRDS関数で読み込む際は、その読み込み先のオブジェクトを指定する必要がある。
> rm(list = ls(all.names = TRUE))
> ls()
character(0)
> no <- 1:3
> name <- c("安野希世乃", "石見舞菜香", "和多田美咲")
> meibo <- data.frame(no, name)
> print(meibo)
no name
1 1 安野希世乃
2 2 石見舞菜香
3 3 和多田美咲
> readr::write_rds(meibo, file = "meibo.rds")
> rm(list = ls(all.names = TRUE))
> ls()
character(0)
> readr::read_rds(file = "meibo.rds")
no name
1 1 安野希世乃
2 2 石見舞菜香
3 3 和多田美咲
> ls()
character(0)
> dtf <- readr::read_rds(file = "meibo.rds")
> ls()
[1] "dtf"
> print(dtf)
no name
1 1 安野希世乃
2 2 石見舞菜香
3 3 和多田美咲
write_rds関数はsave関数やsaveRDS関数と異なり、デフォルトではファイルを圧縮処理しない。そのため、ファイルサイズは大きくなるが、その分、保存時も読み込み時も動作が早い。なお、ファイルを圧縮処理するように指定することもできる。
以下ではwrite_rds関数とread_rds関数について、適当な巨大なデータフレームを作成して、ファイルの圧縮処理するか否かで、保存・読み込み時の実行時間を比較した例。見てのとおり、圧縮処理するとファイルサイズは約半分になるが、保存時は10倍以上時間がかかることがわかる。読み込み時も、保存時ほどではないが処理が早く済むことがわかる。
> rm(list = ls(all.names = TRUE))
> len <- 20
> ch <- c(LETTERS, letters)
> n <- 10 ^ 6
> sei <- mei <- character(n)
> for (i in 1:n) sei[i] <- paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "")
> for (i in 1:n) mei[i] <- paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "")
> no <- 1:(n * 10)
> age <- floor(runif(n * 10, 20, 66))
> meibo <- data.frame(no, sei, mei, age)
> nrow(meibo)
[1] 10000000
> tail(meibo)
no sei mei age
9999995 9999995 hidOwZgfbrLerBCHprrj rEXTnzTjfnRHoaAYFQLk 53
9999996 9999996 KJPkdfMRQmoAsxvNXzYx DBwannCmxuEdYyfnaYTC 58
9999997 9999997 ODqATMYtqIvEzcvzfZmd QpBDgfnOUeWAkmWfzjcI 25
9999998 9999998 JsnBlbiwMdyRzGzYlOPA nJBFwQMStWHPdwEFgKMe 32
9999999 9999999 fvQMCLOULLReHDuJSrbs pSwrJDxXPYvJMeECpeoJ 33
10000000 10000000 kVmjgBweXtfoFzROlivD RaHBkUfyvlkMBeEgbTYa 36
> system.time(readr::write_rds(meibo, file = "meibo_none.rds"))
ユーザ システム 経過
1.15 0.47 2.49
> system.time(readr::write_rds(meibo, file = "meibo_none.rds"))
ユーザ システム 経過
1.06 0.27 3.32
> system.time(readr::write_rds(meibo, file = "meibo_gz.rds", compress = "gz"))
ユーザ システム 経過
18.08 0.16 21.34
> system.time(readr::write_rds(meibo, file = "meibo_gz.rds", compress = "gz"))
ユーザ システム 経過
14.11 0.23 21.75
> rm(list = ls(all.names = TRUE))
> ls()
character(0)
> file.info(dir(pattern = "*.rds"))["size"]
size
meibo_gz.rds 354125588
meibo_none.rds 680000218
> system.time(dtf <- readr::read_rds(file = "meibo_none.rds"))
ユーザ システム 経過
2.97 0.14 3.58
> system.time(dtf <- readr::read_rds(file = "meibo_none.rds"))
ユーザ システム 経過
3.48 0.32 5.09
> system.time(dtf <- readr::read_rds(file = "meibo_gz.rds"))
ユーザ システム 経過
5.98 0.03 6.72
> system.time(dtf <- readr::read_rds(file = "meibo_gz.rds"))
ユーザ システム 経過
5.92 0.07 6.74