Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取.csv比读取数据快。表::fread_R_Dataframe_Data.table_Fread - Fatal编程技术网

读取.csv比读取数据快。表::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.

在网上我可以看到我应该使用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.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)