r语言处理excel表格数据(R中6种读入表格数据的方式哪个最快)
r语言处理excel表格数据(R中6种读入表格数据的方式哪个最快)
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格式的二进制数据
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包比较使用不同函数读取所需时间。
基于一台破笔记本的速度评估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硬盘的工作站速度评估
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/