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.
跟踪
当使用引用语义遍历 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.