前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R中6种读入表格数据的方式哪个最快?结果出人意料!

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

作者头像
生信宝典
发布2022-01-19 14:33:30
1.5K0
发布2022-01-19 14:33:30
举报
文章被收录于专栏:生信宝典生信宝典

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

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

  1. utils::read.csv: 默认使用的读入方式 (read.table)
  2. readr::read_csv: readr包中的读入函数 (RStudio中默认也包含了这一方式)
  3. data.table::fread: 来自data.table
  4. base::load: 加载rda文件
  5. base::readRDS: 读取二进制数据
  6. 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格式。

代码语言:javascript
复制
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相差不大
代码语言:javascript
复制
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")
  1. 速度最快的是feather::read_feather,但需要预先把数据存储为feather格式。 其次是fread,但差别不明显。
  2. loadreadRDS没有表现出速度优势,但却需要对文件进行格式转。
  3. fread函数读取csv的速度最快; readr::read_csv函数次之; 默认使用的read.csv速度最慢。
代码语言:javascript
复制
# 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")
  1. 速度最快的是readr::read_csv,其次是feather::read_feather,然后是fread
  2. 默认使用的read.csv速度最慢。
代码语言:javascript
复制
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速度最慢。
代码语言:javascript
复制
##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. 不同电脑测试结果差别大(可能是软件版本的问题,也可能是硬件特征问题)。别人用着快的你不一定用着快,多尝试。

参考

  1. https://appsilon.com/fast-data-loading-from-files-to-r/
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信宝典 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • R怎么读入表格数据最快?
    • 生成测试数据
      • 评估速度
        • 基于一台破笔记本的速度评估
        • 基于一台SSD硬盘的工作站速度评估
        • 原始文章的测试结果中,
      • 测试结论
        • 参考
        相关产品与服务
        文件存储
        文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档