R 表引用语义:遍历所有列的内存使用
当使用引用语义遍历R data.table中的所有列时,从内存使用的角度来看,什么更有意义: (1)R 表引用语义:遍历所有列的内存使用,r,data.table,pass-by-reference,R,Data.table,Pass By Reference,当使用引用语义遍历R data.table中的所有列时,从内存使用的角度来看,什么更有意义: (1) dt[,(所有颜色):=lappy(.SD,我的乐趣)] 或 (2) lapply(colnames(dt),function(col)dt[,(col):=my_-fun(dt[[col]])[[1]] 我的问题是:在(2)中,我强制data.table逐列覆盖dt,因此我假设需要按列大小顺序的额外内存。第(1)项也是这样吗?或者在覆盖原始列之前是否对所有lappy(.SD,my_fun)进行
dt[,(所有颜色):=lappy(.SD,我的乐趣)]
或
(2) lapply(colnames(dt),function(col)dt[,(col):=my_-fun(dt[[col]])[[1]]
我的问题是:在(2)中,我强制data.table逐列覆盖dt
,因此我假设需要按列大小顺序的额外内存。第(1)项也是这样吗?或者在覆盖原始列之前是否对所有lappy(.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)
库(data.table)
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]]))
库(data.table)
dt在我的头顶上,如果你打开了优化,内部(1)将转换为(my_-fun(.SD[[1]]),…,my_-fun(.SD[[ncol(.SD)])
;尝试使用verbose=TRUE
运行,并查看?GForce
如果要像(2)中那样循环,最好使用set
;参见?设置
@MichaelChirico优化是为j=。(…)
而不是为:=
所以我想为+设置一个循环是最好的,以最小化内存使用,正如你所建议的那样。@MichaelChirico你能详细说明一下我的问题与GForce
的关系吗?根据文件(v1.11.4),这仅与以下情况有关:my_fun
处于{min
,max
,均值
,中值
,var
,sd
,sum
,prod
,第一位
,最后一位
,头位
,尾位
,但不是针对任意的my_fun
,对吗?请参见优化级别1:“表达式DT[,lapply(.SD,fun),by=.]
优化为DT[,list(fun(a),fun(b),…),by=.]
其中a,b,…
是.SD
中的列。这极大地提高了性能。”