data.table引用语义:遍历所有列的内存使用

data.table reference semantics: memory usage of iterating through all columns

当使用引用语义遍历 R data.table 中的所有列时,从内存使用的角度来看更有意义的是:

(1) dt[, (all_cols) := lapply(.SD, my_fun)]

(2) lapply(colnames(dt), function(col) dt[, (col) := my_fun(dt[[col]])])[[1]]

我的问题是:在 (2) 中,我强制 data.table 逐列覆盖 dt,因此我假设需要按列大小顺序的额外内存. (1)也是这样吗?还是在覆盖原始列之前评估了所有 lapply(.SD, my_fun)

运行 上述变体的一些示例代码:

library(data.table)
dt <- data.table(a = 1:10, b = 11:20)
my_fun <- function(x) x + 1
all_cols <- colnames(dt)

按照@Frank 的建议,通过对每一列应用函数 my_fun 来逐列替换 data.table 的最有效方法(从内存的角度来看)是

library(data.table)
dt <- data.table(a = 1:10, b = 11:20)
my_fun <- function(x) x + 1
all_cols <- colnames(dt)

for (col in all_cols) set(dt, j = col, value = my_fun(dt[[col]]))

当前 (v1.11.4) 的处理方式与 dt[, lapply(.SD, my_fun)] 等表达式的处理方式不同,后者在内部优化为 dt[, list(fun(a), fun(b), ...)],其中 a, b, ... 是 [= 中的列15=](参见 ?datatable.optimize)。这可能会在未来发生变化,并且正在被 #1414.

跟踪