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

问题描述 投票:1回答:1

当使用引用语义迭代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)
r data.table pass-by-reference
1个回答
1
投票

根据@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, ...,其中.SD?datatable.optimize中的列(参见#1414)。这可能会在未来发生变化,并由qazxswpoi跟踪。

© www.soinside.com 2019 - 2024. All rights reserved.