【问题标题】:read.csv faster than data.table::fread [duplicate]read.csv 比 data.table::fread 快 [重复]
【发布时间】:2018-08-09 11:08:44
【问题描述】:

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

我知道fread() 应该比read.csv() 快,因为它首先尝试将行作为字符读入内存,然后尝试将它们转换为整数和因子作为数据类型。另一方面,fread() 只是将所有内容读取为字符。

如果这是真的,test2 不应该比test3 快吗?

有人可以解释一下,为什么我不使用 test2test1 实现加速或至少相同的速度? :)

【问题讨论】:

  • fread 也有一个 colClasses 参数,为了公平比较,您应该使用它。
  • 变化不大。 test1、test2 和 test3 的中位时间分别为 1.28、27.95 和 1.29

标签: r dataframe data.table fread


【解决方案1】:

data.table::freads 如果您考虑更大的文件,则显着的性能优势会变得很明显。这是一个完全可重现的示例。

  1. 让我们生成一个由 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)
    }
    
  2. 我们运行microbenchmark 分析(请注意,这可能需要几分钟,具体取决于您的硬件)

    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)
    

【讨论】:

    【解决方案2】:

    如果您查看函数,您会发现 fread 比 read.csv 进行更多检查。如果您正在阅读的文件很小,我需要更多的时间来检查和准备阅读而不是实际阅读。

    data.table 对于大数据集来说速度非常快。

    【讨论】:

    • read.csv 调用read.table 乍一看并不简单
    • 但问题是,在调用任何东西之前 fread 检查一些可能比直接读取小文件需要更多时间的条件,例如,完全相同的速度很慢
    • 据我了解,您的回答基本上说它比较慢,因为它会测试事物,但 read.table 会测试事物并且您不会比较它们。那么最让我烦恼的是,它似乎暗示read.csv 更快,因为它有 3 行长,这没有意义。
    • 好吧,问题是 fread 使用函数 Creadfile 而 read.csv 使用 read.table,可能 Creadfile 比第二个快得多,但它在输入方面更严格,这意味着data.table 需要更长的准备时间,但如果数据足够长是完全值得的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2014-10-28
    • 1970-01-01
    • 2022-11-09
    • 2013-01-04
    相关资源
    最近更新 更多