首页 > 其他分享 >R中6种读入表格数据的方式哪个最快?结果出人意料!

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

时间:2023-04-21 12:38:10浏览次数:69  
标签:10 出人意料 表格 ## read 读入 2600 feather csv


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)

计算下各个文件的大小;

  • 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中读取包含中文字符的文件时这个诡异的错误你见过吗?
  3. 不同电脑测试结果差别大(可能是软件版本的问题,也可能是硬件特征问题)。别人用着快的你不一定用着快,多尝试。

参考

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


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

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

标签:10,出人意料,表格,##,read,读入,2600,feather,csv
From: https://blog.51cto.com/u_16077014/6212498

相关文章

  • TransformMine图像表格化构建系统
    今日团队任务:图片转excel(5天)前端开发(需团队风格统一)调用接口(后端),json数据->excel前后端连接           任烁玚(进行中)            图片转html(8天)前端开发(需团队风格统一)图片转为pdf(存储)pdf转html(调用接口)[html存储到数据库]前后台数据同......
  • umy-ui表格单行编辑(解决单行编辑滑动后失效问题)
    TableRowEdit.vue<template><div><ux-grid:data="tableData"tooltip-effect="dark"show-overflow="tooltip":cell-style="{'text-align':'center'}&q......
  • 根据题库表文件抽取题目形成试卷表格
    试卷指的是抽取的题目类似试卷,但是不是格式是试卷那种格式。应对考试搞得一个,题库里面的题非常之多,每次都看完不太可能,就想着自动抽取汇总成题目文件。1'''2抽取100道题目:单选30,多选10,填空10,判断改错10,名词解释20,问答203'''45importxlwings6impor......
  • Apple iWork(Pages、Numbers、Keynote)13.0 - 文档、电子表格、演示文稿
    请访问原文链接:https://sysin.org/blog/apple-iwork-13/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org苹果今天将其专为iOS和macOS设备设计的iWork应用套件更新为版本12(sysin),引入了许多新功能和改进功能。文档、电子表格、演示文稿,尽可集思广益。Pages......
  • word表格操作2
    第一题:制作下面的表格第二题: 第三题:1、在文档的第二个段落标记处插入一个9行8列的表格,并在第一行的任一单元格内按下enter键。2、将第一列从第二行处开始划一根表格线,使下面的单元格都分为2个单元格。3、将第六行的单元格合并为一个。4将第一列的2-5行单元格合并为一......
  • elementUI Table 表格编辑数据后停留当前位置
    后台管理系统在实际开发中,表格如果在一定高度出现滚动条。这时如果对表格行数据进行编辑或者拖拽排序操作,数据刷新后滚动条会默认回到顶部,这样体验会不太好。如果想保留在当前位置可以这样操作:1.el-table标签添加ref属性<el-table:data="tableData"v-loading="tableLoading......
  • Smartbi电子表格软件产品的由来​
    思迈特软件(以下简称“Smartbi”)自2022年11月以来发布的「SmartbiSpreadsheet电子表格软件」产品(以下简称“电子表格软件”或"Spreadsheet")。从后续的介绍,你可以明确这个软件就是报表工具,那为什么不叫xxxReport,而叫电子表格软件呢?那就要提到这个产品的最大特点——基于OfficeExce......
  • Smartbi电子表格软件架构与差异化特色​
    选择和Excel结合首先Excel一直被模仿,从未被超越。虽然市场上的报表软件很多,但存在太多的不完美。国外的产品功能复杂、难于学习(控件方式),做不了中国式复杂格式的报表;国内厂商相继模仿Excel,虽然创新了“类Excel”的报表模型,解决了复杂格式的问题,但那终究不是Excel,Excel众多的优秀特性......
  • 【python-docx】添加表格、合并单元格、设置样式
    1.表格1.1添加表格添加表格很简单,只需要调用一下add_table()即可,返回一个Table对象,参数可以指定行、列、样式fromdocximportDocumentdoc=Document()#添加一个5行3列的表格,样式是网格实线table=doc.add_table(5,3,style="TableGrid")doc.save('./test.docx')1.2添......
  • 多个中式表格合并并转换(Power Query)
    数据源:转换结果:let源=Excel.Workbook(File.Contents(".....xlsx")),整理表=Table.SelectColumns(Table.SelectRows(源,each([Kind]="Sheet")andText.EndsWith([Name],"区")),{"Data"}),展开表=Table.ExpandTableCo......