当前位置: 首页 > news >正文

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/


http://www.mrgr.cn/news/4395.html

相关文章:

  • 2408gui,分层窗口1
  • Android studio制作一个高仿计算器小demo
  • 2024年游泳耳机哪个牌子好?四大热门游泳耳机多维测评盘点!
  • 2024年最新版JavaScript学习笔记【3万字总结】(更新中...)
  • 2024年特种设备作业人员考试题库及答案(流动式起重机Q2)
  • 设计模式-创建型模式-原型模式
  • 制造业如何选择适合的工厂ERP系统?17款ERP系统推荐!
  • centos 虚拟机器刚刚安装没有ip地址的问题
  • 【数据结构算法经典题目刨析(c语言)】使用数组实现循环队列(图文详解)
  • Hystrix——服务容错保护库
  • springboot集成海康sdk,针对视频流获取某一点的实时温度
  • NSSM 注册exe服务
  • Leetcode JAVA刷刷站(55)跳跃游戏
  • SpringBoot文档之入门的阅读笔记
  • 【Solidity】变量与类型
  • 你真的了解《黑神话·悟空》吗?揭秘它背后鲜为人知的故事
  • 速度+耐力,希迪智驾引领中国商用车自动驾驶发展
  • 葡萄参考基因组
  • C语言 | Leetcode C语言题解之第338题比特位计数
  • 数据之争:网络爬虫涉及的法律问题