将数据加载到 R 的最佳文件类型(速度方面)?
Best file type for loading data in to R (speed wise)?
我正在 运行 进行一些分析,其中我获得了相当多的 2-3G 之间的数据集。现在,我将其保存为 .RData
文件类型。然后,稍后我将加载这些文件以继续工作,这需要一些时间才能加载。我的问题是:保存然后将这些文件加载为 .csv 会更快吗? data.table
是读取 .csv 文件最快的包吗?我想我正在寻找 R 中的最佳工作流程。
如果您正在寻找读取 CSV 的速度,提到的 vroom
包是一个不错的选择。
.RData 可能很慢,但与 CSV、TSV 等不同,它的优点是可以保存 any R 数据类型:不仅仅是表格数据(通常是数据帧),还有列表、函数、R6 对象等。如果您只需要保存 一个 数据帧,RDS 的写入 (saveRDS
) 和加载 (readRDS
速度更快) 比 .RData.
您还可以查看由 Hadley Wickham 和 Wes McKinney 开发的新 Feather 数据格式。
警告 Feather
:
What should you not use Feather for?
Feather is not designed for long-term data storage. At this time, we do not guarantee that the file format will be stable between versions. Instead, use Feather for quickly exchanging data between Python and R code, or for short-term storage of data frames as part of some analysis.
(Link是2016-03-29的公告...现在可能稳定了)
根据评论和我自己的一些研究,我整理了一个基准。
library(bench)
nr_of_rows <- 1e7
set.seed(1)
df <- data.frame(
Logical = sample(c(TRUE, FALSE, NA), prob = c(0.85, 0.1, 0.05), nr_of_rows, replace = TRUE),
Integer = sample(1L:100L, nr_of_rows, replace = TRUE),
Real = sample(sample(1:10000, 20) / 100, nr_of_rows, replace = TRUE),
Factor = as.factor(sample(labels(UScitiesD), nr_of_rows, replace = TRUE))
)
baseRDS <- function() {
saveRDS(df, "dataset.Rds")
readRDS("dataset.Rds")
}
baseRDS_nocompress <- function() {
saveRDS(df, "dataset.Rds", compress = FALSE)
readRDS("dataset.Rds")
}
baseRData <- function() {
save(list = "df", file = "dataset.Rdata")
load("dataset.Rdata")
df
}
data.table <- function() {
data.table::fwrite(df, "dataset.csv")
data.table::fread("dataset.csv")
}
feather <- function(variables) {
feather::write_feather(df, "dataset.feather")
as.data.frame(feather::read_feather("dataset.feather"))
}
fst <- function() {
fst::write.fst(df, "dataset.fst")
fst::read.fst("dataset.fst")
}
fst <- function() {
fst::write.fst(df, "dataset.fst")
fst::read.fst("dataset.fst")
}
# only works on Unix systems
# fastSave <- function() {
# fastSave::save.pigz(df, file = "dataset.RData", n.cores = 4)
# fastSave::load.pigz("dataset.RData")
# }
results <- mark(
baseRDS(),
baseRDS_nocompress(),
baseRData(),
data.table(),
feather(),
fst(),
check = FALSE
)
结果
summary(results)
# A tibble: 6 x 13
expression min median `itr/sec` mem_alloc
<bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt>
1 baseRDS() 15.74s 15.74s 0.0635 191MB
2 baseRDS_nocompress() 720.82ms 720.82ms 1.39 191MB
3 baseRData() 18.14s 18.14s 0.0551 191MB
4 data.table() 4.43s 4.43s 0.226 297MB
5 feather() 794.13ms 794.13ms 1.26 191MB
6 fst() 233.96ms 304.28ms 3.29 229MB
# ... with 8 more variables: `gc/sec` <dbl>, n_itr <int>,
# n_gc <dbl>, total_time <bch:tm>, result <list>,
# memory <list>, time <list>, gc <list>
> summary(results, relative = TRUE)
# A tibble: 6 x 13
expression min median `itr/sec` mem_alloc
<bch:expr> <dbl> <dbl> <dbl> <dbl>
1 baseRDS() 67.3 51.7 1.15 1.00
2 baseRDS_nocompress() 3.08 2.37 25.2 1.00
3 baseRData() 77.5 59.6 1 1.00
4 data.table() 18.9 14.5 4.10 1.56
5 feather() 3.39 2.61 22.8 1
6 fst() 1 1 59.6 1.20
# ... with 8 more variables: `gc/sec` <dbl>, n_itr <int>,
# n_gc <dbl>, total_time <bch:tm>, result <list>,
# memory <list>, time <list>, gc <list>
基于此,fst
包是最快的。紧随其后的是位于第二位的基数 R,选项 compress = FALSE
。虽然这会产生大文件。我不建议在 csv 中保存任何内容,除非您想使用其他程序打开它。在这种情况下,data.table
将是您的选择。否则我会推荐 saveRDS
或 fst
.
我正在 运行 进行一些分析,其中我获得了相当多的 2-3G 之间的数据集。现在,我将其保存为 .RData
文件类型。然后,稍后我将加载这些文件以继续工作,这需要一些时间才能加载。我的问题是:保存然后将这些文件加载为 .csv 会更快吗? data.table
是读取 .csv 文件最快的包吗?我想我正在寻找 R 中的最佳工作流程。
如果您正在寻找读取 CSV 的速度,提到的 vroom
包是一个不错的选择。
.RData 可能很慢,但与 CSV、TSV 等不同,它的优点是可以保存 any R 数据类型:不仅仅是表格数据(通常是数据帧),还有列表、函数、R6 对象等。如果您只需要保存 一个 数据帧,RDS 的写入 (saveRDS
) 和加载 (readRDS
速度更快) 比 .RData.
您还可以查看由 Hadley Wickham 和 Wes McKinney 开发的新 Feather 数据格式。
警告 Feather
:
What should you not use Feather for?
Feather is not designed for long-term data storage. At this time, we do not guarantee that the file format will be stable between versions. Instead, use Feather for quickly exchanging data between Python and R code, or for short-term storage of data frames as part of some analysis.
(Link是2016-03-29的公告...现在可能稳定了)
根据评论和我自己的一些研究,我整理了一个基准。
library(bench)
nr_of_rows <- 1e7
set.seed(1)
df <- data.frame(
Logical = sample(c(TRUE, FALSE, NA), prob = c(0.85, 0.1, 0.05), nr_of_rows, replace = TRUE),
Integer = sample(1L:100L, nr_of_rows, replace = TRUE),
Real = sample(sample(1:10000, 20) / 100, nr_of_rows, replace = TRUE),
Factor = as.factor(sample(labels(UScitiesD), nr_of_rows, replace = TRUE))
)
baseRDS <- function() {
saveRDS(df, "dataset.Rds")
readRDS("dataset.Rds")
}
baseRDS_nocompress <- function() {
saveRDS(df, "dataset.Rds", compress = FALSE)
readRDS("dataset.Rds")
}
baseRData <- function() {
save(list = "df", file = "dataset.Rdata")
load("dataset.Rdata")
df
}
data.table <- function() {
data.table::fwrite(df, "dataset.csv")
data.table::fread("dataset.csv")
}
feather <- function(variables) {
feather::write_feather(df, "dataset.feather")
as.data.frame(feather::read_feather("dataset.feather"))
}
fst <- function() {
fst::write.fst(df, "dataset.fst")
fst::read.fst("dataset.fst")
}
fst <- function() {
fst::write.fst(df, "dataset.fst")
fst::read.fst("dataset.fst")
}
# only works on Unix systems
# fastSave <- function() {
# fastSave::save.pigz(df, file = "dataset.RData", n.cores = 4)
# fastSave::load.pigz("dataset.RData")
# }
results <- mark(
baseRDS(),
baseRDS_nocompress(),
baseRData(),
data.table(),
feather(),
fst(),
check = FALSE
)
结果
summary(results)
# A tibble: 6 x 13
expression min median `itr/sec` mem_alloc
<bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt>
1 baseRDS() 15.74s 15.74s 0.0635 191MB
2 baseRDS_nocompress() 720.82ms 720.82ms 1.39 191MB
3 baseRData() 18.14s 18.14s 0.0551 191MB
4 data.table() 4.43s 4.43s 0.226 297MB
5 feather() 794.13ms 794.13ms 1.26 191MB
6 fst() 233.96ms 304.28ms 3.29 229MB
# ... with 8 more variables: `gc/sec` <dbl>, n_itr <int>,
# n_gc <dbl>, total_time <bch:tm>, result <list>,
# memory <list>, time <list>, gc <list>
> summary(results, relative = TRUE)
# A tibble: 6 x 13
expression min median `itr/sec` mem_alloc
<bch:expr> <dbl> <dbl> <dbl> <dbl>
1 baseRDS() 67.3 51.7 1.15 1.00
2 baseRDS_nocompress() 3.08 2.37 25.2 1.00
3 baseRData() 77.5 59.6 1 1.00
4 data.table() 18.9 14.5 4.10 1.56
5 feather() 3.39 2.61 22.8 1
6 fst() 1 1 59.6 1.20
# ... with 8 more variables: `gc/sec` <dbl>, n_itr <int>,
# n_gc <dbl>, total_time <bch:tm>, result <list>,
# memory <list>, time <list>, gc <list>
基于此,fst
包是最快的。紧随其后的是位于第二位的基数 R,选项 compress = FALSE
。虽然这会产生大文件。我不建议在 csv 中保存任何内容,除非您想使用其他程序打开它。在这种情况下,data.table
将是您的选择。否则我会推荐 saveRDS
或 fst
.