R中6种读入表格数据的方式哪个最快?结果出人意料!

R怎么读入表格数据最快?

R中有6个常用数据读取函数:

  1. utils::read.csv: 默认使用的读入方式 (read.table)

  2. readr::read_csvreadr包中的读入函数 (RStudio中默认也包含了这一方式)

  3. data.table::fread: 来自data.table

  4. base::load: 加载rda文件

  5. base::readRDS: 读取二进制数据

  6. 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)

计算下各个文件的大小;

  • RDSRData占的空间最小,不到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")
  1. 速度最快的是feather::read_feather,但需要预先把数据存储为feather格式。

    其次是fread,但差别不明显。

  2. loadreadRDS没有表现出速度优势,但却需要对文件进行格式转。

  3. 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")
  1. 速度最快的是readr::read_csv,其次是feather::read_feather,然后是fread

  2. 默认使用的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

原始文章的测试结果中,

  1. 速度最快的是feather,但需要预先把数据存储为feather格式。

    数据库保存为feather格式是很快的,适用于需要读取某个大文件或程序运行中计算出的结果时。

  2. loadreadRDS速度稍次,但也需要对文件进行格式转换,优点是存储的文件较小。

  3. 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

测试结论

  1. 最常用的read.table在每个测试中都是表现最差的。

  2. `readr::read_csv` (处理不同编码更合适,R中读取包含中文字符的文件时这个诡异的错误你见过吗?)和`data.table::fread`可以作为日常使用或读取大表格的首选。

  3. 不同电脑测试结果差别大(可能是软件版本的问题,也可能是硬件特征问题)。别人用着快的你不一定用着快,多尝试。

  4. 读友评论:readr新版本升级之后使用vroom的内核来进行读取,所以速度非常快。值得注意的是,vroom读取的其实并不是完整的数据,只是一种index,所以在之后的操作(比如rbind合并数据框)会展现出比较慢的情况。适合读入大文件,过滤一部分后,进行操作。

  5. 读友评论:使用data.table::fread进行读取默认使用多线程操作,在服务器cpu高负荷时会影响读取速度。总的来说,fread和vroom(read_csv/tsv)是我最喜欢的两种方式,跟作者意见一致。

参考

  1. https://appsilon.com/fast-data-loading-from-files-to-r/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生信宝典

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值