读取.csv比读取数据快。表::fread
在网上我可以看到我应该使用data.table和fread来加载数据 但是,当我运行基准测试时,我会得到以下结果读取.csv比读取数据快。表::fread,r,dataframe,data.table,fread,R,Dataframe,Data.table,Fread,在网上我可以看到我应该使用data.table和fread来加载数据 但是,当我运行基准测试时,我会得到以下结果 Unit: milliseconds expr min lq mean median uq max neval test1 1.229782 1.280000 1.382249 1.366277 1.460483 1.580176 10 test3 1.294726 1.355139 1.
Unit: milliseconds
expr min lq mean median uq max neval
test1 1.229782 1.280000 1.382249 1.366277 1.460483 1.580176 10
test3 1.294726 1.355139 1.765871 1.391576 1.542041 4.770357 10
test2 23.115503 23.345451 42.307979 25.492186 57.772522 125.941734 10
代码可以在下面看到
loadpath <- readRDS("paths.rds")
microbenchmark(
test1 = read.csv(paste0(loadpath,"data.csv"),header=TRUE,sep=";", stringsAsFactors = FALSE,colClasses = "character"),
test2 = data.table::fread(paste0(loadpath,"data.csv"), sep=";"),
test3 = read.csv(paste0(loadpath,"data.csv")),
times = 10
) %>%
print(order = "min")
loadpath%
打印(order=“min”)
我知道fread()
应该比read.csv()
快,因为它首先尝试将行作为字符读入内存,然后尝试将它们转换为整数和因子作为数据类型。另一方面,fread()
如果这是真的,那么test2
不应该比test3
快吗
有人能给我解释一下,为什么我不进行加速,或者至少与test2
和test1
的速度相同:) 如果查看函数,您会发现fread执行的检查比read.csv多。如果你正在阅读的文件很小,我会花更多的时间来检查和准备阅读,而不是实际阅读
数据表对于大数据集来说是难以置信的快。
<代码>数据。表:如果考虑较大的文件,FRADAD 的显著性能优势变得清晰。这是一个完全可复制的示例
让我们生成一个由10^5行和100列组成的CSV文件
if (!file.exists("test.csv")) {
set.seed(2017)
df <- as.data.frame(matrix(runif(10^5 * 100), nrow = 10^5))
write.csv(df, "test.csv", quote = F)
}
read.csv
调用read.table
,简单一看就不那么复杂,但问题是,在调用任何东西之前,fread会检查一些条件,这些条件可能比直接读取一个小文件要花更多的时间,例如,如果我理解完全相同,你的答案基本上是说它比较慢,因为它测试东西,但是read.table
测试东西,而你不比较它们。最让我头疼的是,这似乎暗示read.csv
更快,因为它有3行长,这是没有意义的。好吧,问题是fread使用函数Creadfile,read.csv使用read.table,Creadfile可能比第二行快很多,但在输入方面更严格,这意味着data.table需要更长的准备时间,但如果数据足够长,这是完全值得的。fread
也有一个colClasses
参数,为了公平比较,您应该使用它。它变化不大。测试1、测试2和测试3的中值时间分别为1.28、27.95和1.29:
library(microbenchmark)
res <- microbenchmark(
read.csv = read.csv("test.csv", header = TRUE, stringsAsFactors = FALSE, colClasses = "numeric"),
fread = data.table::fread("test.csv", sep = ",", stringsAsFactors = FALSE, colClasses = "numeric"),
times = 10)
res
# Unit: milliseconds
# expr min lq mean median uq max
# read.csv 17034.2886 17669.8653 19369.1286 18537.7057 20433.4933 23459.4308
# fread 287.1108 311.6304 432.8106 356.6992 460.6167 888.6531
library(ggplot2)
autoplot(res)