r - 有和没有 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。谢谢你。
解决方案
推荐阅读
- ag-grid-react - 无法增加 Ag-grid 行高
- shopify - 如何使用三元或除非排除供应商类型?
- xml - 使用 PLSQL 将 XML 解析为数据库表
- python - 用于有效查找大型集合的小交集的数据结构
- javascript - 在 JavaScript 中使用 $ 作为变量名是否有效?
- javascript - Easy-peasy useStoreActions 不会立即更新状态?
- swift - 无效的诊断签名
- go - Clojure 中的 Golang Ctx WITHTimeOut
- bit-manipulation - bit twiddling : 检查非负整数作为 2 的幂的差
- python - 在这个伪代码中不溢出是什么意思:Assert :: (modulus - 1) * (modulus - 1) does not overflow base