快捷搜索:  汽车  科技

r语言处理excel表格数据(R中6种读入表格数据的方式哪个最快)

r语言处理excel表格数据(R中6种读入表格数据的方式哪个最快)

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格式的二进制数据
生成测试数据

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")

  1. 速度最快的是feather::read_feather 但需要预先把数据存储为feather格式。
  2. 其次是fread,但差别不明显。
  3. load和readRDS没有表现出速度优势,但却需要对文件进行格式转。
  4. fread函数读取csv的速度最快;
  5. readr::read_csv函数次之;
  6. 默认使用的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格式。
  2. 数据库保存为feather格式是很快的,适用于需要读取某个大文件或程序运行中计算出的结果时。
  3. load和readRDS速度稍次,但也需要对文件进行格式转换,优点是存储的文件较小。
  4. fread函数读取csv的速度最快;
  5. readr::read_csv函数次之;
  6. 默认使用的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. 不同电脑测试结果差别大(可能是软件版本的问题,也可能是硬件特征问题)。别人用着快的你不一定用着快,多尝试。
参考
  1. https://appsilon.com/fast-data-loading-from-files-to-r/

r语言处理excel表格数据(R中6种读入表格数据的方式哪个最快)(1)

猜您喜欢: