R怎么读入表格数据最快?
R中有6个常用数据读取函数:
utils::read.csv
: 默认使用的读入方式 (read.table)readr::read_csv
:readr
包中的读入函数 (RStudio中默认也包含了这一方式)data.table::fread
: 来自data.table
包base::load
: 加载rda文件base::readRDS
: 读取二进制数据feather::read_feather
: 一种新的feather
格式的二进制数据
生成测试数据
代码语言:javascript复制set.seed(123)
df <- data.frame(replicate(10, sample(0:2000, 15 * 10^5, rep = TRUE)),
replicate(10, stringi::stri_rand_strings(1000, 5)))
dim(df)
[1] 1500000 20
把数据存储为csv
格式,feather
格式, RDS
格式和Rdata
格式。
path_csv <- 'df.csv'
path_feather <- 'df.feather'
path_rdata <- 'df.RData'
path_rds <- 'df.rds'
library(feather)
library(data.table)
write.csv(df, file = path_csv, row.names = F)
write_feather(df, path_feather)
save(df, file = path_rdata)
saveRDS(df, path_rds)
计算下各个文件的大小;
RDS
和RData
占的空间最小,不到30M
feather
文件占的空间最大,185M
CSV
文件占了179M
,与feather
相差不大
files <- c('df.csv', 'df.feather', 'df.RData', 'df.rds')
info <- file.info(files)
info$size_mb <- info$size/(1024 * 1024)
print(subset(info, select=c("size_mb")))
## size_mb
## df.csv 179.46119
## df.feather 185.96806
## df.RData 29.93043
## df.rds 29.93044
评估速度
采用microbenchmark
包比较使用不同函数读取所需时间。
基于一台破笔记本的速度评估
代码语言:javascript复制library(microbenchmark)
benchmark <- microbenchmark(readCSV = utils::read.csv(path_csv),
readrCSV = readr::read_csv(path_csv, progress = F),
fread = data.table::fread(path_csv, showProgress = F),
loadRdata = base::load(path_rdata),
readRds = base::readRDS(path_rds),
readFeather = feather::read_feather(path_feather), times = 10)
# save(benchmark, file = "benchmark.rda")
- 速度最快的是
feather::read_feather
,但需要预先把数据存储为feather
格式。 其次是fread
,但差别不明显。 load
和readRDS
没有表现出速度优势,但却需要对文件进行格式转。fread
函数读取csv
的速度最快;readr::read_csv
函数次之; 默认使用的read.csv
速度最慢。
# load("benchmark.rda")
# min最小耗时
# lq, uq 耗时的第一和第三四分位数
# max最大耗时
summary(benchmark)
## expr min lq mean median uq max neval
## 1 readCSV 18167.9870 18788.3618 19925.4103 19007.2041 22030.0041 23347.212 10
## 2 readrCSV 3464.2280 4000.4398 4275.1156 4244.4979 4323.3464 5383.394 10
## 3 fread 942.6006 977.3619 1252.6054 1265.5249 1429.5995 1741.290 10
## 4 loadRdata 4759.2474 4797.0618 5409.0172 5128.4355 6019.2456 7179.577 10
## 5 readRds 4808.1431 4891.1552 5653.4468 5708.4353 6233.9128 6473.565 10
## 6 readFeather 673.4313 739.8717 894.3114 871.7041 934.1121 1351.928 10
基于一台SSD硬盘的工作站速度评估
代码语言:javascript复制library(microbenchmark)
benchmark2 <- microbenchmark(readCSV = utils::read.csv(path_csv),
readrCSV = readr::read_csv(path_csv, progress = F),
fread = data.table::fread(path_csv, showProgress = F),
loadRdata = base::load(path_rdata),
readRds = base::readRDS(path_rds),
readFeather = feather::read_feather(path_feather), times = 10)
save(benchmark2, file = "benchmark2.rda")
- 速度最快的是
readr::read_csv
,其次是feather::read_feather
,然后是fread
。 - 默认使用的
read.csv
速度最慢。
load("benchmark2.rda")
print(benchmark2, signif = 2)
## Unit: milliseconds
## expr min lq mean median uq max neval
## readCSV 9200 9200 9300 9300 9400 9600 10
## readrCSV 240 250 290 260 270 470 10
## fread 500 520 540 530 550 620 10
## loadRdata 2500 2600 2600 2600 2600 2600 10
## readRds 2500 2500 2600 2600 2600 2600 10
## readFeather 370 410 410 410 440 450 10
原始文章的测试结果中,
- 速度最快的是
feather
,但需要预先把数据存储为feather
格式。 数据库保存为feather
格式是很快的,适用于需要读取某个大文件或程序运行中计算出的结果时。 load
和readRDS
速度稍次,但也需要对文件进行格式转换,优点是存储的文件较小。fread
函数读取csv
的速度最快;readr::read_csv
函数次之; 默认使用的read.csv
速度最慢。
##Unit: seconds
## expr min lq mean median uq max neval
## readCSV 200.0 200.0 211.187125 210.0 220.0 240.0 10
## readrCSV 27.0 28.0 29.770890 29.0 32.0 33.0 10
## fread 15.0 16.0 17.250016 17.0 17.0 22.0 10
## loadRdata 4.4 4.7 5.018918 4.8 5.5 5.9 10
## readRds 4.6 4.7 5.053674 5.1 5.3 5.6 10
## readFeather 1.5 1.8 2.988021 3.4 3.6 4.1 10
测试结论
- 最常用的
read.table
在每个测试中都是表现最差的。 - `readr::read_csv` (处理不同编码更合适,R中读取包含中文字符的文件时这个诡异的错误你见过吗?)和`data.table::fread`可以作为日常使用或读取大表格的首选。
- 不同电脑测试结果差别大(可能是软件版本的问题,也可能是硬件特征问题)。别人用着快的你不一定用着快,多尝试。
参考
- https://appsilon.com/fast-data-loading-from-files-to-r/