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

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

时间:2024-08-22 16:54:23浏览次数:13  
标签:10 出人意料 表格 ## fread read 读入 feather csv

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,出人意料,表格,##,fread,read,读入,feather,csv
From: https://blog.csdn.net/qazplm12_3/article/details/141432644

相关文章

  • Spire.Doc for Java(cracked)实现复制word中的表格(2)
    先看效果,符不符合你的需求。背景: word插入的表格数据填充到该表格时,如果数据量超过该的表格数,应将表格在下一页重新创建该表格,并将剩余数据继续填充到新的表格中。再简单点:word表格只有5行,但是数据有20行,表格不够添加,就还需要复制3份一样的表格,中间需要分页符隔开,最终得......
  • 一个能够生成 Markdown 表格的 Bash 脚本
    哈喽大家好,我是咸鱼。今天分享一个很实用的bash脚本,可以通过手动提供单元格内容和列数或者将带有分隔符的文件(如CSV、TSV文件)转换为Markdown表格。源代码在文末哦!原文链接:https://josh.fail/2022/pure-bash-markdown-table-generator/具体功能:手动生成表格:允许用户输入......
  • ant design vue 表格table 和复选框Checkbox结合 实现树形数据操作
    前言:最近在做一个权限管理的页面,需要配置权限。业务给的要求在表格里,展示权限以及编辑权限。然后根据权限数组,动态展示模块。页面需求:可以设定每个公司或者部门的单独权限,可以编辑保存权限主要实现:1.全选,反选(递归循环,every,some实现)2.子级选中其父级选中,父级取消子级也取消3.......
  • MarkDown基础及表格、KaTeX公式、矩阵、流程图、UML图、甘特图语法
    概述最多可设置6级标题技巧列表有序列表MD语法:1.你好2.我也好呈现效果:你好我也好无序列表MD语法:-a-b*aa*bb+aaa+bbb效果:abaabbaaabbb结论,支持三种方式:-、*、+TODO列表MD语法:-[x]后端接口开发-[]与前端联调呈现效果:后端......
  • 表格单元格点击操作(弹窗)
    表格点击单元格出现弹窗<el-tableref="table":data="tableList"row-key="tableId"@row-click="handleRowClick"><el-table-columnlabel="列1"p......
  • 表格控件:计算引擎、报表、集算表
    近日,葡萄城正式发布了SpreadJS最新版本V17.1,为前端表格控件市场带来了一系列令人瞩目的新特性和功能增强。本次更新旨在进一步提升用户在计算引擎、报表生成和分析等方面的体验,为各行业的开发者提供更强大的工具支持。主要更新亮点工作薄增强居右对齐将样式的textDirection......
  • 不同矩阵变换的特征值和特征向量对比,简洁明了的大表格!
    为了方便自己,也为了方便大家总结如图,毫无废话,原矩阵为A矩阵特征值特征向量----如有错误还请告知,觉得很对欢迎点赞!......
  • c语言中%f和%lf读入浮点型数据
     001、a、%lf、和%f读入double型值[root@PC1test]#lstest.c[root@PC1test]#cattest.c##测试程序#include<stdio.h>intmain(void){doublei,j;//声明两个double型变量printf("i:");scanf("%lf&q......
  • c语言中读入整型数据和浮点型数据
     001、读入整型数据[root@PC1test]#lstest.c[root@PC1test]#cattest.c##测试脚本#include<stdio.h>intmain(void){inti;//声明整型变量puts("pleaseinputaninteger.");print......
  • C. 在表格里造序列
    题意对于每一对满足\(1\lei,j\len\)的\((i,j)\),计算有多少个长度为\(m\)的序列,权值在\([1,n]\)之间且\(\gcd(a_1,a_2,...,a_m)=\gcd(i,j)\)。答案对\(998244353\)取模。思路方法:莫比乌斯反演+杜教筛不会莫比乌斯反演?出门右转:OI-wiki。不会杜教筛?出门右转:OI-wi......