首页 > 解决方案 > 有和没有 colClasses 的 R data.table fread 性能

问题描述

我需要提出一个脚本来设置两个向量之间的差异操作(以查找不匹配的值的计数)。第一个向量是字符向量(可以更改)。该集合将与从 csv 文件中读取的 3000 个其他向量进行区分。所有 csv 文件只有一列,并且其中具有唯一值。每个文件的大小在 1 到 60 MB 之间。

我正在使用 data.table fread 来读取 csv 文件。但是,我看到使用 colClasses 选项将值作为字符读取会大大增加脚本时间。在下面的脚本中,选项 1 大约需要 10 秒,而选项 2 大约需要 120 秒。我想将列作为字符读取。为什么会有这种差异?如果必须解析值以找出类型,那么读取不应该花费更长的时间吗?另外,如何在保持类型为字符的同时加快阅读速度?

代码:

path <- "data/processed_data"
file_names <- list.files(here(path), pattern="csv")
v <- c("one", "two", "three")
v_count_unmatched <- integer()
  
for (fn2 in file_names) {
    f2 <- data.table::fread(here(path, fn2)) #### Option 1
    #f2 <- data.table::fread(here(path, fn2), colClasses = 'character') #### Option 2
    v_count_unmatched      <- c(v_count_unmatched, length(setdiff(v,f2 %>% pull() )))
}

我正在使用 data.table 版本 1.13.6。谢谢你。

标签: rcsvdata.tableset

解决方案


推荐阅读